給定n,m,k,計算
∑i=1n∑j=1mgcd(i,j)k
對 1000000007 取模的結果
前置知識
式子還是正常的推
首先,IDk(x)=xk
i=1∑nj=1∑mIDk(gcd(i,j))
d=1∑IDk(d)i=1∑nj=1∑m[gcd(i,j)=d]
d=1∑IDk(d)i=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)=1]
d=1∑IDk(d)i=1∑⌊dn⌋j=1∑⌊dm⌋D∣gcd(i,j)∑μ(D)
d=1∑IDk(d)D=1∑min(n,m)μ(D)i=1∑⌊dDn⌋j=1∑⌊dDm⌋1
d=1∑IDk(d)D=1∑⌊dn⌋μ(D)⌊dDn⌋⌊dDm⌋
設 T=dD
T=1∑⌊Tn⌋⌊Tm⌋d∣T∑IDk(d)μ(dT)
我們發現後面這個東西就是狄利克雷卷積
我們管它叫 f 函數
也就是說
f=IDk∗μ
由於積性函數卷積性函數還是積性函數
對於 x∈prime f(x)=xk−1
這樣子就直接在線性篩的時候算一下就好了
代碼:
void sieve(){
f[1]=1;
for(int i=2;i<MAXN;i++){
if(!vis[i]){
prime[++prime[0]]=i;
f[i]=(pw(i,k)-1+Mod)%Mod;
}
for(int j=1;j<=prime[0]&&i*prime[j]<MAXN;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0){f[i*prime[j]]=f[i]*(f[prime[j]]+1)%Mod;break;}
f[i*prime[j]]=f[i]*f[prime[j]]%Mod;
}
}
for(int i=1;i<MAXN;i++)s[i]=(s[i-1]+f[i])%Mod;
}