题意:求欧拉函数
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool valid[50005];
int ans[50005];
int tot=0;
void getPrime()
{
int n=50000;
memset(valid,true,sizeof(valid));
valid[1]=valid[0]=false;
for(int i=2;i<n;++i)
{
if(valid[i])
{
ans[tot++]=i;
}
for(int j=0;((j<tot)&&(i*ans[j]<=n));j++)
{
valid[i*ans[j]]=false;
if(i%ans[j]==0)break;
}
}
}
int phi(int n)
{
int rea=n;
for(int i=0;ans[i]*ans[i]<=n;++i)
{
if(n%ans[i]==0)
{
rea=rea-rea/ans[i];
while(n%ans[i]==0)
{
n/=ans[i];
}
}
}
if(n>1)
{
rea=rea-rea/n;
}
return rea;
}
int main()
{
// freopen("data.txt","r",stdin);
getPrime();
int n;
while(scanf("%d",&n)!=EOF && n)
{
printf("%d\n",phi(n));
}
return 0;
}