链接: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;
}