problem
给定 n , m n,m n,m,求:
∑ i = 1 n ∑ j = 1 m l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^m\mathrm{lcm}(i,j) i=1∑nj=1∑mlcm(i,j)
答案对 20101009 20101009 20101009 取模。
数据范围: n , m ≤ 1 0 7 n,m\le 10^7 n,m≤107。
solution
由于这道题中两层枚举的上界不一样,不能以这道题的方法处理,只有老老实实反演了。
接下来的处理都挺套路的,我就直接写了:
a n s = ∑ i = 1 n ∑ j = 1 m i j gcd ( i , j ) \begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{\gcd(i,j)} \end{aligned} ans=i=1∑nj=1∑mgcd(i,j)ij
枚举 gcd \gcd gcd:
a n s = ∑ k = 1 n 1 k ∑ i = 1 n ∑ j = 1 m i j [ gcd ( i , j ) = k ] = ∑ k = 1 n k ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ i j [ gcd ( i , j ) = 1 ] \begin{aligned} ans&=\sum_{k=1}^n\frac 1 k\sum_{i=1}^n\sum_{j=1}^mij[\gcd(i,j)=k]\\ &=\sum_{k=1}^nk\sum_{i=1}^{\lfloor\frac n k\rfloor}\sum_{j=1}^{\lfloor\frac m k\rfloor}ij[\gcd(i,j)=1] \end{aligned} ans=k=1∑nk1i=1∑nj=1∑mij[gcd(i,j)=k]=k=1∑nki=1∑⌊kn⌋j=1∑⌊km⌋ij[gcd(i,j)=1]
莫反:
a n s = ∑ k = 1 n k ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ i j ∑ d ∣ i , d ∣ j μ ( d ) = ∑ k = 1 n k ∑ d = 1 ⌊ n k ⌋ μ ( d ) ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ m k d ⌋ ( i d ) ( j d ) = ∑ k = 1 n k ∑ d = 1 ⌊ n k ⌋ μ ( d ) d 2 ∑ i = 1 ⌊ n k d ⌋ i ∑ j = 1 ⌊ m k d ⌋ j \begin{aligned} ans&=\sum_{k=1}^nk\sum_{i=1}^{\lfloor\frac n k\rfloor}\sum_{j=1}^{\lfloor\frac m k\rfloor}ij\sum_{d|i,d|j}\mu(d)\\ &=\sum_{k=1}^nk\sum_{d=1}^{\lfloor\frac n k\rfloor}\mu(d)\sum_{i=1}^{\lfloor\frac n {kd}\rfloor}\sum_{j=1}^{\lfloor\frac m {kd}\rfloor}(id)(jd)\\ &=\sum_{k=1}^nk\sum_{d=1}^{\lfloor\frac n k\rfloor}\mu(d)d^2\sum_{i=1}^{\lfloor\frac n {kd}\rfloor}i\sum_{j=1}^{\lfloor\frac m {kd}\rfloor}j \end{aligned} ans=k=1∑nki=1∑⌊kn⌋j=1∑⌊km⌋ijd∣i,d∣j∑μ(d)=k=1∑nkd=1∑⌊kn⌋μ(d)i=1∑⌊kdn⌋j=1∑⌊kdm⌋(id)(jd)=k=1∑nkd=1∑⌊kn⌋μ(d)d2i=1∑⌊kdn⌋ij=1∑⌊kdm⌋j
令 T = k d T=kd T=kd,设 S ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 S(n)=\sum_{i=1}^ni=\frac{n(n+1)}2 S(n)=∑i=1ni=2n(n+1):
a n s = ∑ T = 1 n ∑ d ∣ T μ ( d ) d 2 T d S ( ⌊ n T ⌋ ) S ( ⌊ m T ⌋ ) = ∑ T = 1 n T ∑ d ∣ T μ ( d ) d S ( ⌊ n T ⌋ ) S ( ⌊ m T ⌋ ) \begin{aligned} ans&=\sum_{T=1}^n\sum_{d|T}\mu(d)d^2\frac T d S(\lfloor\frac n T\rfloor)S(\lfloor\frac m T\rfloor)\\ &=\sum_{T=1}^nT\sum_{d|T}\mu(d)d\; S(\lfloor\frac n T\rfloor)S(\lfloor\frac m T\rfloor) \end{aligned} ans=T=1∑nd∣T∑μ(d)d2dTS(⌊Tn⌋)S(⌊Tm⌋)=T=1∑nTd∣T∑μ(d)dS(⌊Tn⌋)S(⌊Tm⌋)
设 f ( n ) = ∑ d ∣ n μ ( d ) d f(n)=\sum_{d|n}\mu(d)d f(n)=∑d∣nμ(d)d 的话,发现它是积性函数,用线性筛预处理一下即可。
时间复杂度 O ( n ) O(n) O(n)。
code
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5,P=20101009;
int n,m,up,ans;
int add(int x,int y) {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y) {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y) {return 1ll*x*y%P;}
int power(int a,int b){
int ans=1;
for(;b;b>>=1,a=mul(a,a)) if(b&1) ans=mul(ans,a);
return ans;
}
int sum,prime[N],mark[N],f[N];
void linear_sieves(){
f[1]=1;
for(int i=2;i<N;++i){
if(!mark[i]) prime[++sum]=i,f[i]=mul(P-1,i)+1;
for(int j=1;j<=sum&&i*prime[j]<N;++j){
mark[i*prime[j]]=1;
if(i%prime[j]) f[i*prime[j]]=mul(f[i],f[prime[j]]);
else {f[i*prime[j]]=f[i];break;}
}
}
}
int S(int x) {return 1ll*x*(x+1)/2%P;}
int main(){
scanf("%d%d",&n,&m),up=min(n,m),linear_sieves();
for(int i=1;i<=up;++i) ans=(ans+1ll*f[i]*i%P*S(n/i)%P*S(m/i)%P)%P;
printf("%d\n",ans);
return 0;
}