洛谷P3768 简单的数学题

洛谷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=1nj=1nijgcd(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=1nj=1nijgcd(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=1ni=1dnj=1dnd3ij×[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=1ni=1dnj=1dnd3ij×ki,kjμ(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=1nk=1dnμ(k)i=1kdnj=1kdnd3k2ij

稍作变换,可得

∑ 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=1nd3k=1dnμ(k)×k2(i=1kdni)(j=1kdnj)

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=1ni=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=1nd3k=1dnμ(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=1nsum(⌊Tn)2×T2dTdμ(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=1nsum(⌊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=dnϕ(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=n2dnϕ(d)=dn(dn)2ϕ(dn)×d2=n2ϕ(n)+dn,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)=n3dn,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)=n3dn,d>1d2×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=1ni3i=1ndi,d>1d2×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=1ni3d=2nd2i=1dnf(i)=i=1ni3d=2nd2F(⌊dn⌋)

注:

  • ∑ i = 1 n i 3 = ( ∑ i = 1 n i ) 2 \sum_{i=1}^ni^3=(\sum\limits_{i=1}^ni)^2 i=1ni3=(i=1ni)2
  • ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum\limits_{i=1}^ni^2=\dfrac{n(n+1)(2n+1)}{6} i=1ni2=6n(n+1)(2n+1)

code

#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;
}

你可能感兴趣的:(题解,c++)