#include<bits/stdc++.h>
using namespace std;
int phi(int n) {//欧拉函数
int ans = n;
for (int i = 2; i <= sqrt(n); ++i)
if (n % i == 0) {
ans = ans / i * (i-1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n-1);
return ans;
}
/*
特性 :
1.若a为质数,phi[a]=a-1;
2.若a为质数,b mod a=0,phi[a*b]=phi[b]*a
3.若a,b互质,phi[a*b]=phi[a]*phi[b](当a为质数时,if b mod a!=0 ,phi[a*b]=phi[a]*phi[b])
欧拉公式的延伸:这些质因数的总和是phi(n)*n/2
*/
int main(){
int t;cin>>t;
int n;
while(t--){
cin>>n;
cout<<phi(n)<<endl;
}
}
——————————————————————
#include<bits/stdc++.h>
using namespace std;
int euler(int n){ //返回euler(n)
int res=n,a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);
cout<<"i:"<<i<<endl;
while(a%i==0) a/=i;//这里其实就说明,最先出现的都是素因数,后面就都除掉了,所以每次都是进入的i都是素因数
//我好蠢,这里也想了半天
}
}
if(a>1) res=res/a*(a-1);
return res;
}
int main(){
int n;
while(cin>>n)
cout<<euler(n)<<endl;
}
————————————————————————————
<span style="font-size:18px;"><span style="font-size:18px;">void Init(){
euler[1]=1;
for(int i=2;i<Max;i++)
euler[i]=i;//这里如果相等,表明不是前面数的倍数,表明i是素数
for(int i=2;i<Max;i++)
if(euler[i]==i)
for(int j=i;j<Max;j+=i)
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
} </span></span>