代码:
#include<stdio.h>
int euler(int n)
{
int res=n;
int a=n;
for(int i=2; i*i<=a; i++)
{
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0)
{
a/=i;
}
}
}
if(a>1)
res=res/a*(a-1);
return res;
}
const int N=3000005;
int prime[N]= {0};
int phi[N]= {0};
bool is_prime[N]= {0};
void get_phi()
{
int i,j,k;
k=0;
phi[1]=1;
for( i=2; i<N; i++)
{
if(!is_prime[i])
{
prime[k++]=i;
phi[i]=i-1;
}
for( j=0; j<k&&i*prime[j]<N; j++)
{
is_prime[i*prime[j]]=true;
if(!(i%prime[j]))
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main()
{
get_phi();
while(1)
{
int a;
scanf("%d",&a);
printf("%d\n",phi[a]);
printf("%d\n",euler(a));
}
}