链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2421
解答:详见《入门经典 训练指南》 125页
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn=4000000; long long phi[maxn]; long long s[maxn+10],f[maxn+10]; void phi_table(long long n) { for(int i=2;i<=n;i++) phi[i]=0; phi[1]=1; for(int i=2;i<=n;i++) if(!phi[i]) for(int j=i;j<=n;j+=i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } int main() { phi_table(maxn); memset(f,0,sizeof(f)); for(int i=1;i<=maxn;i++) for(int j=i*2;j<=maxn;j+=i) //最大公约数不能为本身 f[j]+=i*phi[j/i]; s[2]=f[2]; for(int i=3;i<=maxn;i++) s[i]=s[i-1]+f[i]; int n; while(cin>>n) { if(n==0) break; cout<<s[n]<<endl; } return 0; }