#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int ans[100000];
int main()
{
long long n;
cin>>n;
long long N=n;
int pos=-1;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) ans[++pos]=i;
while(n%i==0) n=n/i;
}
if(n>1) ans[++pos]=n;
int res=N;
for(int i=0;i<=pos;i++)
{
res=res-res/ans[i];
}
cout<<res;
return 0;
}
这道题数据太大不应用筛法,应该对n分解质因数,从2试除到sqrt(n),如果遇到可以整除的那就是n的质因子,把它除干净,如果最后剩下一个大于1的数,那就是最大的质因子,有了所有的质因子以后就可以套欧拉公式了。
用欧拉函数公式也是先分解质因数,比方说12=2*2*3,质因子是2和3,那答案就是12*(1-1/2)*(1-1/3)=4,再比方说36=2*2*3*3,那么质因子是2和3,答案是36*(1-1/2)*(1-1/3)=12。而代码中第一个for循环的过程就是在分解质因数。
(注意过程中是在n上操作,所以要先用N来保存初始n值)