给定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;
}