一个数的欧拉函数 也就是找1-N中与N互质的数的个数![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4ba98098f4a337b9c36fee6db14a63eb.png)
公式是这个 p是质因子 ,对于求的时候只用用求质因子 对于(p-1)/p 这个就需要 改变一下 就可以先除 在乘就行了然后把这个质因子的所有找出来过掉
#include <iostream>
using namespace std;
int oula(int x){
int res=x;
for(int i=2;i<=x/i;i++){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0)x/=i;
}
}
if(x>1)res=res/x*(x-1);
return res;
}
int main(){
int t;cin>>t;
while(t--){
int a;cin>>a;
cout<<oula(a)<<endl;
}
}
筛法求欧拉数
在筛素数的上面筛欧拉数 用线性筛 ,当你是素数 那么也就是 任何一个小于你的数都是互质 那么就是i-1 ,当你筛的时候 对于f[j]*i 这个位置的欧拉数 就是phi[i]*f[j]的个数,然后对于i%f[j]==0时 就应该为 phi[i] * (f[j]-1)
#include <iostream>
using namespace std;
const int N=1e6+10;
int f[N];
int phi[N];
bool st[N];
int idx;
long long psi(int n){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!st[i]){
phi[i]=i-1;
f[idx++]=i;
}
for(int j=0;f[j]<=n/i;j++){
int t=f[j]*i;
st[t]=true;
if(i%f[j]==0){
phi[t]=phi[i]*f[j];
break;
}
phi[t]=phi[i]*(f[j]-1);
}
}
long long res=0;
for(int i=1;i<=n;i++)res+=phi[i];
return res;
}
int main(){
int n;cin>>n;
cout<<psi(n)<<endl;
}