思路:欧拉函数 做法 同 poj2480
时限好像是3s 我的AC代码运行的好像是接近5s 记得用%lld 用%I64d会Wa
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1000001;
long long euler[maxn];
long long prime[maxn/3];
bool isprime[maxn];
long long ans[maxn];
void solve()
{
int cnt=0;
memset(isprime,1,sizeof(isprime));
for(int i=2;i<maxn;i++)
{
if(isprime[i])
{
prime[++cnt]=i;
euler[i]=i-1;
}
for(int j=1;j<=cnt&&prime[j]*i<maxn;j++)
{
isprime[prime[j]*i]=0;
if(i%prime[j]!=0)
euler[i*prime[j]]=euler[i]*euler[prime[j]];
else
{
euler[i*prime[j]]=euler[i]*prime[j];
break;
}
}
}
}
void init()
{
solve();
ans[0]=0;
for(long long i=1;i*i<maxn;i++)
{
ans[i*i]+=i*euler[i];
for(long long j=i+1;j*i<maxn;j++)
ans[i*j]+=i*euler[j]+j*euler[i];
}
for(int i=1;i<maxn;i++)
ans[i]+=ans[i-1];
}
int main()
{
init();
int n;
while(scanf("%d",&n)&&n)
{
printf("%lld\n",ans[n]);
}
return 0;
}