HYSBZ 2818 Gcd【欧拉函数/莫比乌斯】
Sample Output4Hint
hint
对于样例(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
【分析】:欧拉函数计算互质个数 + 前缀和 + 次序不同算不同 + 去除1
【代码】:
#include<bits/stdc++.h> using namespace std; #define maxn 10000010 #define maxp 700000 #define _for(i,a,b) for(int i=(a); i<(b); i++) #define rep(i,a,b) for(int i=(a); i<=(b); i++) #define ll long long long long N, phi[maxn], s[maxn], tot, p[maxp], ans; void oula() { int i, j; for(i=1;i<=N;i++)phi[i]=i; for(i=2;i<=N;i++) { if(phi[i]==i) { p[++tot]=i; for(j=i;j<=N;j+=i) phi[j]=phi[j]/i*(i-1); } } for(i=1;i<=N;i++)s[i]=s[i-1]+phi[i]; } int main() { int i, j; scanf("%d",&N); oula(); for(i=1;i<=tot;i++) ans=ans+(s[N/p[i]]<<1)-1; printf("%lld\n",ans); return 0; }