【校內模擬】羊(杜教篩)

k=1ni=1kj=1kgcd(i,j,k)\sum_{k=1}^n\sum_{i=1}^k\sum_{j=1}^kgcd(i,j,k)


題解:

f(n)=i=1nj=1ngcd(i,j,n)f(n)=\sum_{i=1}^n\sum_{j=1}^ngcd(i,j,n),簡單變換髮現 f(n)=dnd2ϕ(n/d)f(n)=\sum_{d\mid n}d^2\phi(n/d),是個積性函數,可以考慮線性篩。

然而考慮前綴和 i=1ndid2ϕ(i/d)=d=1nd2i=1ndϕ(i)\sum_{i=1}^n\sum_{d\mid i}d^2\phi(i/d)=\sum_{d=1}^nd^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\phi(i)

杜教篩維護 ϕ\phi 的前綴和即可。


代碼:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const

using std::cerr;
using std::cout;

int mod,iv2,iv6;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}
inline int po(int a,int b){int r=1;for(;b;b>>=1,Mul(a,a))if(b&1)Mul(r,a);return r;}
inline void ex_gcd(int a,int b,int &x,int &y){
	if(!b){x=1,y=0;return ;}ex_gcd(b,a%b,y,x);y-=a/b*x;
}inline int Inv(int a){int x,y;ex_gcd(mod,a,y,x);return x+(x>>31&mod);}
inline int S1(int n){return n*(n+1ll)/2%mod;}
inline int S2(int n){return mul(mul(n,iv6),mul(n+1,n+n+1));}

cs int N=1e6+7,K=1e6;

int n;

int p[N],pc;
bool mrk[N];
int phi[N],Phi[N];

inline int get_phi(int x){
	return x<=K?phi[x]:Phi[n/x];
}void init_math(){
	phi[1]=1;
	for(int re i=2;i<=K;++i){
		if(!mrk[i])p[++pc]=i,phi[i]=i-1;
		for(int re j=1;i*p[j]<=K;++j){
			mrk[i*p[j]]=true;
			if(i%p[j])
				phi[i*p[j]]=phi[i]*(p[j]-1);
			else {
				phi[i*p[j]]=phi[i]*p[j];
				break;
			}
		}
	}for(int re i=1;i<=K;++i)Inc(phi[i],phi[i-1]);
	for(int re i=n/K;i;--i){
		int n=::n/i;Phi[i]=S1(n);
		for(int re l=2,r,u;u=n/l;l=r+1)
			Dec(Phi[i],mul(get_phi(u),(r=n/u)-l+1));
	}
}


void Main(){
	scanf("%d%d",&n,&mod);
	init_math();iv6=Inv(6);int ans=0;
	for(int re l=1,r,u;u=n/l;l=r+1)
		Inc(ans,mul(dec(get_phi(r=n/u),get_phi(l-1)),S2(u)));
	cout<<ans<<"\n";
}

inline void file(){
#ifdef zxyoi
	freopen("yang.in","r",stdin);
#endif
}signed main(){file();Main();return 0;}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章