洛谷P3768 简单的数学题 杜教筛

看样子就是个数学题。
其实这篇博客也是参考了部分题解的。
我们要求的是
a n s = ∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) ans=\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j) ans=i=1nj=1nijgcd(i,j)
这个肯定需要进行相应的变换
a n s = ∑ d = 1 n d ∑ i = 1 n ∑ j = 1 n i j [ g c d ( i , j ) = d ] ( 枚 举 g c d ) ans=\sum_{d=1}^{n}d\sum_{i=1}^{n}\sum_{j=1}^{n}ij[gcd(i,j)=d](枚举gcd) ans=d=1ndi=1nj=1nij[gcd(i,j)=d]gcd
= ∑ d = 1 n d 3 ∑ i = 1 ⌊ n / d ⌋ ∑ j = 1 ⌊ n / d ⌋ i j [ g c d ( i , j ) = 1 ] ( 把 d 提 取 出 来 ) =\sum_{d=1}^{n}d^3\sum_{i=1}^{\lfloor n/d \rfloor}\sum_{j=1}^{\lfloor n/d \rfloor}ij[gcd(i,j)=1] (把d提取出来) =d=1nd3i=1n/dj=1n/dij[gcd(i,j)=1](d)
= ∑ d = 1 n d 3 ∑ i = 1 ⌊ n / d ⌋ ∑ j = 1 ⌊ n / d ⌋ i j ∑ x ∣ g c d ( i , j ) μ ( x ) ( 莫 比 乌 斯 反 演 ) =\sum_{d=1}^{n}d^3\sum_{i=1}^{\lfloor n/d \rfloor}\sum_{j=1}^{\lfloor n/d \rfloor}ij\sum_{x|gcd(i,j)} \mu(x) (莫比乌斯反演) =d=1nd3i=1n/dj=1n/dijxgcd(i,j)μ(x)()
= ∑ d = 1 n d 3 ∑ x = 1 ⌊ n / d ⌋ μ ( x ) x 2 ∑ i ⌊ n / d x ⌋ ∑ j ⌊ n / d x ⌋ i j ( 把 x 提 前 ) =\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2\sum_i^{\lfloor n/dx \rfloor}\sum_j^{\lfloor n/dx \rfloor}ij(把x提前) =d=1nd3x=1n/dμ(x)x2in/dxjn/dxij(x)
= ∑ d = 1 n d 3 ∑ x = 1 ⌊ n / d ⌋ μ ( x ) x 2 ( 1 + 2 + . . . + ⌊ n x d ⌋ ) 2 ( 后 面 两 个 相 等 , 可 以 自 己 理 解 一 下 ) =\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2(1+2+...+\lfloor\frac{n}{xd}\rfloor)^2(后面两个相等,可以自己理解一下) =d=1nd3x=1n/dμ(x)x2(1+2+...+xdn)2()
我们令T=xd, Sum(x)= ∑ i = 1 x i \sum_{i=1}^x i i=1xi
a n s = ∑ d = 1 n d 3 ∑ x = 1 ⌊ n / d ⌋ μ ( x ) x 2 S u m ( ⌊ n T ⌋ ) ans=\sum_{d=1}^{n}d^3\sum_{x=1}^{\lfloor n/d \rfloor} \mu(x)x^2Sum(\lfloor\frac{n}{T}\rfloor) ans=d=1nd3x=1n/dμ(x)x2Sum(Tn)
= ∑ T = 1 n S u m 2 ( ⌊ n T ⌋ ) ∑ d ∣ T d 3 ∗ ( T d ) 2 ∗ μ ( T d ) =\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)\sum_{d|T}d^3*(\frac{T}{d})^2*\mu(\frac{T}{d}) =T=1nSum2(Tn)dTd3(dT)2μ(dT)
= ∑ T = 1 n S u m 2 ( ⌊ n T ⌋ ) ∗ T 2 ∑ d ∣ T d ∗ μ ( T d ) =\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)*T^2\sum_{d|T}d*\mu(\frac{T}{d}) =T=1nSum2(Tn)T2dTdμ(dT)
由于 ∑ d ∣ T d ∗ μ ( T / d ) = ϕ ( T ) \sum _{d|T}d*\mu(T/d)=\phi(T) dTdμ(T/d)=ϕ(T)(不懂的可以看这里),因此我们有
a n s = ∑ T = 1 n S u m 2 ( ⌊ n T ⌋ ) ∗ T 2 ϕ ( T ) ans=\sum_{T=1}^{n} Sum^2(\lfloor\frac{n}{T}\rfloor)*T^2\phi(T) ans=T=1nSum2(Tn)T2ϕ(T)
由杜教筛的结论,我们可以对前面对部分采用数论分块,并可以在低于线性时间内求出 ϕ ( T ) \phi(T) ϕ(T)的前缀和,这题就这么做完了。
由于本人比较菜,并不会算复杂度,数论分块的复杂度是 n \sqrt n n ,杜教筛复杂度为 n 2 / 3 n^{2/3} n2/3,最后复杂度应该是低于线性的吧

附上代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e6+5;
ll pri[N],vis[N],phi[N],tot,mod,inv2,inv6;
unordered_map<ll,ll>vv,mp;
ll power(ll a,ll n){
	ll res=1;
	for(;n;n>>=1,a=a*a%mod)
		if(n&1)
			res=res*a%mod;
	return res;
}
void init(){
	inv2=power(2,mod-2);
	inv6=power(6,mod-2);
	phi[1]=1;
	for(int i=2;i<N;i++){
		if(!vis[i]){
			pri[tot++]=i;
			phi[i]=i-1;
		}
		for(int j=0;j<tot&&pri[j]*i<N;j++){
			int x=i*pri[j];
			vis[x]=1;
			if(i%pri[j]==0){
				phi[x]=phi[i]*pri[j];
				break;
			}
			phi[x]=phi[i]*(pri[j]-1);
		}
	}
	for(int i=2;i<N;i++){
		phi[i]=(phi[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
	}
}
ll sum1(ll x){
	x%=mod;
	return x%mod*(x+1)%mod*inv2%mod; 
}
ll sum2(ll x){
	x%=mod;
	return x*(x+1)%mod*(x+x+1)%mod*inv6%mod;
}
ll cal(ll x){
	if(x<N)
		return phi[x];
	if(vv[x])
		return mp[x];
	ll res=0;
	for(ll i=2,j;i<=x;i=j+1){
		j=x/(x/i);
		res=(res+cal(x/i)*(sum2(j)-sum2(i-1)+mod)%mod)%mod;
	}
	res=(sum1(x)*sum1(x)%mod-res+mod)%mod;
	vv[x]=1,mp[x]=res;
	return res;
}
int main(){
	ll n,ans=0;
	scanf("%lld%lld",&mod,&n);
	init();
	for(ll i=1,j;i<=n;i=j+1){
		j=n/(n/i);
		ans=(ans+sum1(n/i)*sum1(n/i)%mod*(cal(j)-cal(i-1)+mod)%mod)%mod;
	}
	printf("%lld\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值