标签:c++ int 复习计划 ons ret lcm line 计划 typedef
现在感觉反演好多都是套路QAQ……
#include<bits/stdc++.h> using namespace std; const int N=2e6+5; typedef long long ll; int n,cnt,prime[N],phi[N],mu[N],vis[N]; ll ans,s[N],f[N]; void calcmu(){ memset(prime,0,sizeof(prime));cnt=0; memset(phi,0,sizeof(phi));memset(mu,0,sizeof(mu)); memset(s,0,sizeof(s));memset(f,0,sizeof(f)); mu[1]=1;phi[1]=1;memset(vis,1,sizeof(vis)); for(int i=2;i<=n;i++){ if(vis[i]){prime[++cnt]=i;mu[i]=-1;phi[i]=i-1;} for(int j=1;j<=cnt;j++){ int t=prime[j]*i;if(t>n)break; vis[t]=0; if(i%prime[j]==0){ mu[t]=0;phi[t]=phi[i]*prime[j]; break; } mu[t]=-mu[i];phi[t]=phi[i]*(prime[j]-1); } } for(int i=1;i<=n;i++)s[phi[i]]++; for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=i)f[i]+=s[j]; for(int i=1;i<=n;i++)f[i]=f[i]*f[i]; for(int i=1;i<=n;i++)if(mu[i]!=0) for(int d=1;i*d<=n;d++)ans+=mu[i]*phi[d]*f[i*d]; printf("%lld\n",ans); } inline int read(){ int f=1,x=0;char ch; do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘); do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘); return f*x; } int main(){ int T=read(); while(T--){ n=read();ans=0;calcmu(); } }
现在没有爱蜜莉雅碳陪我做题啦TAT
【反演复习计划】【51nod1594】Gcd and Phi
标签:c++ int 复习计划 ons ret lcm line 计划 typedef
原文地址:http://www.cnblogs.com/zcysky/p/6901284.html