求单个数的欧拉函数(分解质因素求欧拉函数)
如果没有给出唯一分解式,只需要每次找到一个素因子之后把它“除干净”,即可保证找到的因子都是素数。
int euler_phi(int n){
int m = (int)sqrt(n+0.5);
int ans=n;
for(int i=2; i<m; 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;
}
筛法欧拉函数
int euler[3000001];
void getEuler(){
memset(euler,0,sizeof(euler));
euler[1] = 1;
for(int i = 2;i <= 3000000;i++)
if(!euler[i])
for(int j = i;j <= 3000000; j += i){
if(!euler[j])
euler[j] = j;
euler[j] = euler[j]/i*(i-1);
}
}
线性筛(同时得到欧拉函数和素数表)
const int MAXN = 10000000;
bool check[MAXN+10];
int phi[MAXN+10],prime[MAXN+10];
int tot; //素数的个数
void phi_and_prime_table(int N){
memset(check,false,sizeof(check));
phi[1] = 1;
tot = 0;
for(int i = 2; i <= N; i++){
if(!check[i]){
prime[tot++] = i;
phi[i] = i-1;
}
for(int j = 0; j < tot; j++){
if(i * prime[j] > N) break;
check[i*prime[j]] = true;
if(i%prime[j] == 0){
phi[i*prime[j]] = phi[i]*prime[j];
break;
}
else{
phi[i*prime[j]] = phi[i]*(prime[j]-1);
}
}
}
}