今有 n,p∈N∗,求i=1∑nj=1∑nij⋅gcd(i,j)
n≤1010。
Solution
设S(n)=i=1∑nj=1∑nij⋅gcd(i,j)=k=1∑ni=1∑nj=1∑nij⋅[gcd(i,j)=k]=k=1∑ni=1∑⌊kn⌋j=1∑⌊kn⌋kij⋅[gcd(i,j)=k]=k=1∑ni=1∑⌊kn⌋j=1∑⌊kn⌋k3ij[gcd(i,j)=1]
因为μ∗I=ϵ所以d∣gcd(i,j)∑μ(d)=[gcd(i,j)=1]
即S(n)=k=1∑ni=1∑⌊kn⌋j=1∑⌊kn⌋k3ij⋅d∣gcd(i,j)∑μ(d)=k=1∑ni=1∑⌊kn⌋j=1∑⌊kn⌋k3ij⋅d=1∑⌊kn⌋μ(d)⋅[d∣gcd(i,j)]=k=1∑nd=1∑⌊kn⌋(i=1∑⌊kn⌋j=1∑⌊kn⌋ij)⋅k3⋅μ(d)⋅[d∣gcd(i,j)]=k=1∑nd=1∑⌊kn⌋(i=1∑⌊kdn⌋j=1∑⌊kdn⌋ij)⋅k3d2⋅μ(d)
令F(x)=i=1∑xj=1∑xij=[2x(x+1)]2D=kd
则S(n)=k=1∑nk3d=1∑⌊kn⌋F(⌊kdn⌋)μ(d)⋅d2=k=1∑nk3⋅D=1∑⌊kn⌋F(⌊Dn⌋)μ(d)⋅(kD)2=k=1∑nk∣D∑D≤nF(⌊Dn⌋)μ(d)⋅kD=D=1∑nk∣D∑F(⌊Dn⌋)μ(d)⋅kD=D=1∑nF(⌊Dn⌋)D⋅[k∣D∑μ(kD)k]
因为μ∗id=φ所以
S(n)=D=1∑nD2F(⌊Dn⌋)φ(D)
注意到 f 里有一项是 φ,考虑φ∗I=id设f(x)g(x)h(x)S′(x)=x2φ(x),=id2(x)=x2,=x3=i=1∑xi2φ(i)则f∗g=h
根据 杜教筛 的套路,得g(1)S′(n)=i=1∑nh(i)−d=2∑ng(d)⋅S′(⌊dn⌋)即S′(n)=i=1∑nh(i)−d=2∑nd2S′(⌊dn⌋)S(n)=D=1∑nF(⌊Dn⌋)S′(D)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
#define reg register
const int MAXN=5000010;
typedef long long ll;
ll mod,n;
bool vis[MAXN+10];
int p[MAXN+10];
ll phi[MAXN+10];
int len=0;
ll S_f[MAXN+10];
ll inv6;
std::map<ll,ll> mp;
ll ksm(ll x,ll p){
if(!p) return 1;
ll c=ksm(x,p/2)%mod;
if(p&1) return c*c%mod*x%mod;
return c*c%mod;
}
ll F(ll x){
x%=mod;
return x*(x+1)/2%mod*(x*(x+1)/2%mod)%mod;
}
void init(){
memset(vis,1,sizeof(vis));vis[1]=0;
memset(p,0,sizeof(p));len=0;phi[1]=1;
for(reg int i=2;i<=MAXN;++i){
if(vis[i]){
p[++len]=i;
phi[i]=(i-1)%mod;
}
for(reg int j=1;(j<=len)&&(i*p[j]<=MAXN);++j){
vis[i*p[j]]=0;
if(i%p[j])
phi[i*p[j]]=phi[i]*(p[j]-1)%mod;
else{
phi[i*p[j]]=phi[i]*p[j]%mod;
break;
}
}
}
S_f[0]=0;
for(reg int i=1;i<=MAXN;++i)
S_f[i]=(S_f[i-1]+phi[i]*i%mod*i%mod)%mod;
}
ll Sq(ll x){
x%=mod;
return x*(x+1)%mod*(x+x+1)%mod*inv6%mod;
}
ll S(ll x){
if(x<MAXN) return S_f[x];
if(mp[x]) return mp[x];
ll sum=0;
for(reg ll l=2,r;l<=x;l=r+1){
r=x/(x/l);
sum=(sum+S(x/l)*(Sq(r)-Sq(l-1)+mod)%mod)%mod;
}
return mp[x]=((F(x)-sum+mod)%mod);
}
int main(){
scanf("%lld%lld",&mod,&n);
init();inv6=ksm(6,mod-2);
ll ans=0;
for(reg ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans=(ans+F(n/l)*(S(r)-S(l-1)+mod)%mod)%mod;
}
printf("%lld",ans);
}
注意点乘和 Dirichlet 卷积的区别!!!