做题一定程度不在多 关键是做一道题 把所联系的知识点融合在一块 感觉这是最大的进步
//注意精度问题。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define max 1000010
int is_prime[max];
int Euler_num[max];
void if_prime()
{
memset(is_prime,0,sizeof(is_prime));
int tem=(int)sqrt(max*1.0);
for(int i=2; i<=tem; i++)
if(is_prime[i]==0)
for(int j=i*i; j<max; j+=i)
is_prime[j]=1;
}
void Euler()
{
for(int i=1; i<=max; i++)
Euler_num[i]=i;
for(int j=2; j<=max; j++)
{
if(is_prime[j]==0)
for(int i=j; i<=max; i+=j)
{
Euler_num[i]=Euler_num[i]/j*(j-1);
}
}
}
int main()
{
int n;
__int64 ans;
if_prime();
Euler();
while(scanf("%d",&n),n)
{
ans=0;
// printf("2=%d\n",Euler_num[2]);
for(int i=2;i<=n;i++)
{
ans+=Euler_num[i];
}
printf("%I64d\n",ans);
}
return 0;
}