[bzoj2693]jzptab
又没推出来……
不过通过这道题还是学到好多东西呢,比如积性函数,线筛什么的。
$sum limits _{i=1}^{n} sum limits _{j=1}^{m} lcm(i,j)$
=$sum limits _{d=1}^{min(n,m)} sum limits _{i=1}^{left lfloor frac{n}{d} ight floor} sum limits _{j=1}^{left lfloor frac{m}{d} ight floor} i*j*d left [ gcd(i,j)=1 ight ]$
=$sum limits _{d=1}^{min(n,m)} sum limits _{i=1}^{left lfloor frac{n}{d} ight floor} sum limits _{j=1}^{left lfloor frac{m}{d} ight floor} left ( i*j*d *sum limits _{tmid gcd(i,j)}u(t) ight )$
=$sum limits _{d=1}^{min(n,m)} d* sum limits _{i=1}^{left lfloor frac{n}{d} ight floor} sum limits _{j=1}^{left lfloor frac{m}{d} ight floor} left ( i*j *sum limits _{tmid gcd(i,j)}u(t) ight )$
=$sum limits _{d=1}^{min(n,m)} d* sum limits _{t=1}^{minleft ( left lfloor frac{n}{d} ight floor left lfloor frac{m}{d} ight floor ight )} u(t) * t^2 *sum limits _{i=1}^{left lfloor frac{n}{d*t} ight floor} sum limits _{j=1}^{left lfloor frac{m}{d*t} ight floor} i*j$
自己推到这就又不会了……
主要是没想到这玩意:$sum limits _{i} sum limits _{j} left ( i*j ight )= sum limits _{i} left ( i*sum limits _{j} j ight ) = left ( sum limits _{i}i ight )*left ( sum limits _{j}j ight )$
于是原式=$sum limits _{d=1}^{min(n,m)} sum limits _{t=1}^{minleft ( left lfloor frac{n}{d} ight floor ,left lfloor frac{m}{d} ight floor ight )} u(t) * t^2 *left ( sum limits _{i=1}^{left lfloor frac{n}{d*t} ight floor}i ight ) * left ( sum limits _{j=1}^{left lfloor frac{m}{d*t} ight floor}j ight )$
后面是一个等差数列,原式=$sum limits _{d=1}^{min(n,m)} d* left ( sum limits _{t=1}^{minleft ( left lfloor frac{n}{d} ight floor left lfloor frac{m}{d} ight floor ight )} u(t)*t^2 *frac{left lfloor frac{n}{d*t} ight floor *left ( left lfloor frac{n}{d*t} ight floor +1 ight ) * left lfloor frac{m}{d*t} ight floor left ( left lfloor frac{m}{d*t} ight floor +1 ight )}{4} ight )$
令T=d*t,原式=$sum limits _{T=1}^{min(n,m)} frac{left lfloor frac{n}{T} ight floor * left ( left lfloor frac{m}{T} ight floor +1 ight ) * left lfloor frac{m}{T} ight floor * left ( left lfloor frac{m}{T} ight floor +1 ight )}{4} * T*sum limits _{tmid T}u(t)*t $
到这里式子就推完了(稍恶心),之后设$f(n)=n*sum limits _{tmid n} u(t)*t$,通过一些我看不懂的证明可以发现它是积性函数,于是我们可以用线筛搞出来它,前面的部分整除分块就可以了。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #define int LL 5 #define LL long long 6 using namespace std; 7 const int mod=100000009; 8 bool noprime[12000000]; 9 int prime[12000000],cnt; 10 int low[12000000],f[12000000],mu[12000000]; 11 void shai(int n) 12 { 13 f[1]=mu[1]=1; 14 for(int i=2;i<=n;i++) 15 { 16 if(!noprime[i]) prime[++cnt]=i,mu[i]=-1,f[i]=-i+1+mod; 17 for(int j=1;j<=cnt&&prime[j]*i<=n;j++) 18 { 19 noprime[prime[j]*i]=1; 20 if(i%prime[j]==0){f[i*prime[j]]=f[i];break;} 21 f[i*prime[j]]=(f[i]*f[prime[j]])%mod;mu[i*prime[j]]=-mu[i]; 22 } 23 } 24 for(int i=1;i<=n;i++)f[i]=f[i]*i%mod; 25 for(int i=1;i<=n;i++)f[i]=(f[i]+f[i-1])%mod; 26 } 27 LL get(LL x){return (x*(x+1)/2)%mod;} 28 int T,n,m; 29 signed main() 30 { 31 shai(12000000); 32 cin>>T; 33 while(T--) 34 { 35 cin>>n>>m;if(n>m)swap(n,m); 36 LL ans=0; 37 for(int l=1,r;l<=n;l=r+1) 38 { 39 r=min(n/(n/l),m/(m/l)); 40 ans=(ans+get(n/l)*get(m/l)%mod*((f[r]-f[l-1]+mod)%mod)%mod)%mod; 41 } 42 printf("%lld ",(ans%mod+mod)%mod); 43 } 44 }