[51nod 1594]Gcd and Phi
2016-12-12 22:13
393 查看
题目大意
求所有(i,j)满足1<=i<=n和1<=j<=n,phi(i)和phi(j)的gcd的欧拉函数值和。数论题
挺简单的。枚举gcd然后莫比乌斯反演一波。
接下来的式子中需要用到的均能够进行n log n预处理。
式子不太想写了, 可以看看代码。
#include<cstdio> #include<algorithm> #include<cmath> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=2000000+10; ll f[maxn],g[maxn]; int mu[maxn],pri[maxn],phi[maxn],num[maxn],cnt[maxn]; bool bz[maxn]; int i,j,k,l,t,n,m,top,ca; ll ans; int main(){ mu[1]=phi[1]=1; fo(i,2,maxn-10){ if (!bz[i]){ pri[++top]=i; mu[i]=-1; phi[i]=i-1; } fo(j,1,top){ if ((ll)i*pri[j]>maxn-10) break; bz[i*pri[j]]=1; if (i%pri[j]==0){ mu[i*pri[j]]=0; phi[i*pri[j]]=phi[i]*pri[j]; break; } mu[i*pri[j]]=-mu[i]; phi[i*pri[j]]=phi[i]*(pri[j]-1); } } scanf("%d",&ca); while (ca--){ scanf("%d",&n); fo(i,1,n) cnt[i]=num[i]=f[i]=g[i]=0; fo(i,1,n) num[phi[i]]++; fo(i,1,n) fo(j,1,n/i) cnt[i]+=num[i*j]; fo(i,1,n) g[i]=(ll)cnt[i]*cnt[i]; fo(i,1,n) fo(j,1,n/i) f[i]+=g[i*j]*mu[j]; ans=0; fo(i,1,n) ans+=(ll)phi[i]*f[i]; printf("%lld\n",ans); } }
相关文章推荐
- 51Nod-1594-Gcd and Phi
- 【51NOD 1594】Gcd and Phi
- 51nod 1594 Gcd and Phi
- 【51nod】1594 Gcd and Phi
- [51Nod 1594] Gcd and Phi
- 51nod 1594 Gcd and Phi 莫比乌斯反演
- 51NOD 1594:Gcd and Phi——题解
- 51nod 1594 Gcd and Phi
- 51nod 1594 Gcd and Phi
- 51nod 2026 Gcd and Lcm
- 51nod 1119 机器人走方格V2(求组合数,费马小定理+快速幂/逆元+gcd)
- 51nod 1678 lyk与gcd | 容斥原理
- 51nod 1192 Gcd表中的质数
- 51nod 2026 Gcd and Lcm
- 51nod 1575 Gcd and Lcm
- 51nod_1179_计算N个数之间两两之间GCD的最大值
- 51Nod 1011 最大公约数GCD
- 51Nod-1011 最大公约数GCD【欧几里得算法】
- 51Nod 1011 最大公约数GCD
- 51Nod 1011 最大公约数GCD