[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 }
View Code