花里胡哨的一堆东西,其实就是在区间[1,N],求N的互质数有多少个。
这里引入一个欧拉函数的概念:(欧拉真的高产似母猪)
f(n)=n*Π((p-1)/p) p为n的质因数
#include<iostream>
#include<cstring>
#include<cmath>
#define maxn 1000005
using namespace std;
int s[maxn];
int prime(int n){
int cnt=0;
//获得n的质因数
if(n%2==0) s[cnt++]=2;
while(n%2==0){
n/=2;
}
for(int i=3;i<=sqrt(1.0*n);i+=2){
if(n%i==0){
s[cnt++]=i;
n/=i;
}
while(n%i==0){
n/=i;
}
}
if(n>2){
s[cnt++]=n;
}
return cnt;
}
int wula(int n){
int cnt = prime(n);
double f=n;
for(int i=0;i<cnt;i++){
f*=1.0*(s[i]-1)/s[i];
}
return (int)(f+0.5);
}
int main(){
int cn,n;
cin>>cn;
while(cn--){
memset(s,0,sizeof(s));
cin>>n;
cout<<wula(n)<<endl;
}
return 0;
}