本题题意就是要对输入的任意一个1e9内的数字求出其欧拉函数值
根据
-
欧拉函数
编辑
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D344/sign=da2dc03b1a950a7b713548c03ed1625c/6a600c338744ebf88c69ff32def9d72a6059a7a7.jpg)
可以在O(sqrt(n))的复杂度求出这个值
code:
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int lim = 100005;
bool vis[lim];
vector<int>p;
void prime()
{
for(int i=2;i<lim;i++)
{
if(!vis[i]){
p.push_back(i);
for(int j=i+i;j<lim;j+=i)vis[i]=1;
}
}
}
int main()
{
prime();
int c;
while(scanf("%d",&c),c)
{
ll ans = c,pc= c;
for(int i=0;p[i]*p[i]<=pc;i++)
{
if(pc%p[i]==0)
{
while(pc%p[i]==0)pc/=p[i];
ans=ans*(p[i]-1)/p[i];
}
}
if(pc>1)ans=ans*(pc-1)/pc;
printf("%lld\n",ans);
}
return 0;
}