洛谷P3768 简单的数学题
给出 n n n和质数 p p p,求
( ∑ i = 1 n ∑ j = 1 n i j gcd ( i , j ) ) m o d p \left(\sum_{i=1}^n\sum_{j=1}^n ij \gcd(i,j)\right) \bmod p (i=1∑nj=1∑nijgcd(i,j))modp
前置知识:杜教筛
原式为
∑ i = 1 n ∑ j = 1 n i j gcd ( i , j ) \sum_{i=1}^n\sum_{j=1}^n ij \gcd(i,j) i=1∑nj=1∑nijgcd(i,j)
枚举 gcd \gcd gcd可得
∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ d 3 i j × [ gcd ( i , j ) = 1 ] \sum\limits_{d=1}^n\sum_{i=1}^{\lfloor \frac nd\rfloor}\sum_{j=1}^{\lfloor \frac nd\rfloor} d^3ij\times [\gcd(i,j)=1] d=1∑ni=1∑⌊dn⌋j=1∑⌊dn⌋d3ij×[gcd(i,j)=1]
利用莫比乌斯函数的性质,可得
∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ d 3 i j × ∑ k ∣ i , k ∣ j μ ( k ) \sum\limits_{d=1}^n\sum_{i=1}^{\lfloor \frac nd\rfloor}\sum_{j=1}^{\lfloor \frac nd\rfloor} d^3ij\times\sum\limits_{k|i,k|j}\mu(k) d=1∑ni=1∑⌊dn⌋j=1∑⌊dn⌋d3ij×k∣i,k∣j∑μ(k)
枚举 k k k,得
∑ d = 1 n ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ n k d ⌋ d 3 k 2 i j \sum\limits_{d=1}^n\sum\limits_{k=1}^{\lfloor \frac nd\rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{kd}\rfloor} d^3k^2ij d=1∑nk=1∑⌊dn⌋μ(k)i=1∑⌊kdn⌋j=1∑⌊kdn⌋d3k2ij
稍作变换,可得
∑ d = 1 n d 3 ∑ k = 1 ⌊ n d ⌋ μ ( k ) × k 2 ( ∑ i = 1 ⌊ n k d ⌋ i ) ( ∑ j = 1 ⌊ n k d ⌋ j ) \sum\limits_{d=1}^nd^3\sum\limits_{k=1}^{\lfloor \frac nd\rfloor}\mu(k)\times k^2(\sum_{i=1}^{\lfloor \frac{n}{kd}\rfloor}i)(\sum_{j=1}^{\lfloor \frac{n}{kd}\rfloor}j) d=1∑nd3k=1∑⌊dn⌋μ(k)×k2(i=1∑⌊kdn⌋i)(j=1∑⌊kdn⌋j)
设 s u m ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 sum(n)=\sum\limits_{i=1}^ni=\dfrac{n(n+1)}{2} sum(n)=i=1∑ni=2n(n+1),则原式变为
∑ d = 1 n d 3 ∑ k = 1 ⌊ n d ⌋ μ ( k ) × k 2 × s u m ( ⌊ n k d ⌋ ) 2 \sum\limits_{d=1}^nd^3\sum\limits_{k=1}^{\lfloor \frac nd\rfloor}\mu(k)\times k^2\times sum(\lfloor \dfrac{n}{kd}\rfloor)^2 d=1∑nd3k=1∑⌊dn⌋μ(k)×k2×sum(⌊kdn⌋)2
令 T = k d T=kd T=kd,枚举 T T T,得
∑ T = 1 n s u m ( ⌊ n T ⌋ ) 2 × T 2 ∑ d ∣ T d μ ( T d ) \sum\limits_{T=1}^nsum(\lfloor\dfrac nT\rfloor)^2\times T^2\sum\limits_{d|T}d\mu(\dfrac Td) T=1∑nsum(⌊Tn⌋)2×T2d∣T∑dμ(dT)
由狄利克雷卷积可得, μ ∗ I d = ϕ \mu*Id=\phi μ∗Id=ϕ,于是原式变为
∑ T = 1 n s u m ( ⌊ n T ⌋ ) 2 × T 2 ϕ ( T ) \sum\limits_{T=1}^nsum(\lfloor\dfrac nT\rfloor)^2\times T^2\phi(T) T=1∑nsum(⌊Tn⌋)2×T2ϕ(T)
我们可以用数论分块求解,需要 T 2 ϕ ( T ) T^2\phi(T) T2ϕ(T)的前缀和,用杜教筛来求,步骤如下
由欧拉函数的性质, n = ∑ d ∣ n ϕ ( n d ) n=\sum\limits_{d|n}\phi(\dfrac nd) n=d∣n∑ϕ(dn)
那么
n 3 = n 2 ∑ d ∣ n ϕ ( d ) = ∑ d ∣ n ( n d ) 2 ϕ ( n d ) × d 2 = n 2 ϕ ( n ) + ∑ d ∣ n , d > 1 ( n d ) 2 ϕ ( n d ) × d 2 n^3=n^2\sum\limits_{d|n}\phi(d)=\sum\limits_{d|n}(\dfrac nd)^2\phi(\dfrac nd)\times d^2=n^2\phi(n)+\sum\limits_{d|n,d>1}(\dfrac nd)^2\phi(\dfrac nd)\times d^2 n3=n2d∣n∑ϕ(d)=d∣n∑(dn)2ϕ(dn)×d2=n2ϕ(n)+d∣n,d>1∑(dn)2ϕ(dn)×d2
由此可得
n 2 ϕ ( n ) = n 3 − ∑ d ∣ n , d > 1 ( n d ) 2 ϕ ( n d ) × d 2 n^2\phi(n)=n^3-\sum\limits_{d|n,d>1}(\dfrac nd)^2\phi(\dfrac nd)\times d^2 n2ϕ(n)=n3−d∣n,d>1∑(dn)2ϕ(dn)×d2
设 f ( T ) = T 2 ϕ ( T ) f(T)=T^2\phi(T) f(T)=T2ϕ(T), F F F为 f f f的前缀和,则
f ( n ) = n 3 − ∑ d ∣ n , d > 1 d 2 × f ( n d ) f(n)=n^3-\sum\limits_{d|n,d>1}d^2\times f(\dfrac nd) f(n)=n3−d∣n,d>1∑d2×f(dn)
分别求前缀和得
F ( n ) = ∑ i = 1 n i 3 − ∑ i = 1 n ∑ d ∣ i , d > 1 d 2 × f ( i d ) F(n)=\sum\limits_{i=1}^ni^3-\sum\limits_{i=1}^n\sum\limits_{d|i,d>1}d^2\times f(\dfrac id) F(n)=i=1∑ni3−i=1∑nd∣i,d>1∑d2×f(di)
枚举 d d d得
F ( n ) = ∑ i = 1 n i 3 − ∑ d = 2 n d 2 ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ i = 1 n i 3 − ∑ d = 2 n d 2 F ( ⌊ n d ⌋ ) F(n)=\sum\limits_{i=1}^ni^3-\sum\limits_{d=2}^nd^2\sum\limits_{i=1}^{\lfloor \frac nd\rfloor}f(i)=\sum\limits_{i=1}^ni^3-\sum\limits_{d=2}^nd^2F(\lfloor \frac nd\rfloor) F(n)=i=1∑ni3−d=2∑nd2i=1∑⌊dn⌋f(i)=i=1∑ni3−d=2∑nd2F(⌊dn⌋)
注:
#include
using namespace std;
const int N=5000000;
int z[N+5],pr[N+5];
long long p,ans=0,ny,ph[N+5],sph[N+5];
map<long long,long long>mph;
long long mi(long long t,long long v){
if(v==0) return 1;
long long re=mi(t,v/2);
re=re*re%p;
if(v&1) re=re*t%p;
return re;
}
void init(){
ph[1]=1;
for(int i=2;i<=N;i++){
if(!z[i]){
pr[++pr[0]]=i;ph[i]=i-1;
}
for(int j=1;j<=pr[0]&&i*pr[j]<=N;j++){
z[i*pr[j]]=1;
if(i%pr[j]==0){
ph[i*pr[j]]=ph[i]*pr[j];
break;
}
ph[i*pr[j]]=ph[i]*(pr[j]-1);
}
}
for(int i=1;i<=N;i++){
sph[i]=(sph[i-1]+ph[i]*i%p*i%p)%p;
}
}
long long sum(long long t){
t=t%p;
return t*(t+1)/2%p;
}
long long tw(long long t){
t=t%p;
return t*(t+1)%p*(2*t+1)%p*ny%p;
}
long long djs(long long n){
if(n<=N) return sph[n];
if(mph.count(n)) return mph[n];
long long t,re=0;
for(long long l=2,r;l<=n;l=r+1){
r=n/(n/l);
t=(tw(r)-tw(l-1)+p)%p;
re=(re+t*djs(n/l)%p)%p;
}
t=sum(n);
re=(t*t%p-re+p)%p;
return mph[n]=re;
}
int main()
{
long long n;
scanf("%lld%lld",&p,&n);
init();
ny=mi(6ll,p-2);
for(long long l=1,r;l<=n;l=r+1){
r=n/(n/l);
long long t=sum(n/l);
ans=(ans+(djs(r)-djs(l-1)+p)%p*t%p*t%p)%p;
}
printf("%lld",ans);
return 0;
}