花裏胡哨的一堆東西,其實就是在區間[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;
}