本题题意就是要对输入的任意一个1e9内的数字求出其欧拉函数值
根据
-
欧拉函数
编辑
对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)
而互质指的是公因数为只有1的两个数,任何数与1都互质
根据欧拉公式通式:
可以在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;
}