poj2478~欧拉公式套模板_i++

讨厌数论题,要么难推,要么就是就是套个公式,而且自己还不懂这公式的原理

#include<iostream>
#include<string>
#include<cmath>
#define M 1000005
using namespace std;

int prime[M];
long long ans[M];

int main()
{
int i,j,k;
prime[0] = 0;
prime[1] = 0;
for(i=2;i<M;i++)
prime[i] = 1;
for(i=2;i*i<=M;i++) //构建素数表
{
if(prime[i])
{
for(j=i*i;j<=M;j+=i)
prime[j] = 0;
}
}
for(i=1;i<=M;i++)
{
ans[i] = i;
}
for(i=2;i<=M;i++)
{
if(prime[i]) //ans[x]等于 x有很多质因数p,将p都进行这样的运算x/p*(p-1);
{
for(j=i;j<M;j+=i) //既满足素数又满足是因数
ans[j]=(ans[j]/i)*(i-1);
}
}
for(i=3;i<=M;i++)
ans[i]+=ans[i-1];
while(scanf("%d",&k),k)
{
printf("%lld\n",ans[k]);
}
}