欧拉函数的证明
![]()
求单个数的欧拉函数
int euler(int n){
int ans = n;
for(int i=2;i*i<=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;
}
欧拉函数打表
void euler(){
for(int i=1;i<N;i++) phi[i] = i;
for(int i=2;i<N;i++){
if(phi[i] == i){ //表示是素数
for(int j=i;j<N;j+=i)
phi[j] = phi[j] / i * (i - 1);
}
}
}
欧拉筛法
void init(){
phi[1] = 1;
for(int i=2;i<MAXN;++i){
if(!vis[i]){
phi[i] = i - 1;
num[cnt++] = i;
}
for(int j=0;j<cnt&&i*num[j]<=MAXN;++j){
vis[i * num[j]] = 1;
if(i % num[j]) phi[i * num[j]] = phi[i] * (num[j] - 1);
else{
phi[i * num[j]] = phi[i] * num[j];
break;
}
}
}
}