题目链接:http://poj.org/problem?id=2480
这个题我很早就提交过了,但是之前不知到是哪儿膜拜来的代码。。
今天别人问我,我又回去看了看,发现这个题目已经不是那么难了
按照自己的思路写了写,先开始一直莫名的TLE,后来把n为素数的情况特判了一下
于是就360MS卡过去了。。。
我的代码:
#include<stdio.h>
typedef long long LL;
LL num[70000];
LL eular(LL n)
{
LL i,ret=1;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
n=n/i;
ret=ret*(i-1);
while(n%i==0)
{
n=n/i;
ret=ret*i;
}
}
}
if(n>1)
ret=ret*(n-1);
return ret;
}
int main()
{
LL i,n,k,ans;
while(scanf("%lld",&n)!=EOF)
{
k=0,ans=0;
for(i=1;i*i<n;i++)
{
if(n%i==0)
{
num[k++]=i;
num[k++]=n/i;
}
}
if(i*i==n)
num[k++]=i;
if(k==2)
{
printf("%lld\n",2*n-1);
continue;
}
for(i=0;i<k;i++)
ans=ans+num[i]*eular(n/num[i]);
printf("%lld\n",ans);
}
return 0;
}