汉孤臣の线性筛求欧拉函数之和
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <map> using namespace std; const int maxn=1000000+50; int n,m,ans,p[maxn],v[maxn],cnt; long long o[maxn]; int main() { for (int i=2; i<=maxn-50; ++i) { if (!v[i]) p[++cnt]=i,v[i]=i,o[i]=i-1; for (int j=1; j<=cnt && p[j]*i<=maxn-50 && p[j]<=v[i]; ++j) { v[i*p[j]]=p[j]; if (p[j]==v[i]) o[p[j]*i]=o[i]*p[j]; else o[p[j]*i]=o[i]*(p[j]-1); } } for (; scanf("%d",&n) && n!=0; printf("%lld\n",o[n]));//输入输出略有鬼畜,请见谅 return 0; }
模板题:http://private.vjudge.net/problem/POJ-2478
前置知识:积性函数

浙公网安备 33010602011771号