Função de Euler: para qualquer inteiro positivo N, o número de inteiros positivos (incluindo 1) que são menores ou iguais a N ([1, N]) e relativamente primos a N é chamado de função de Euler a N, denotado como φ (n ) Nota: Coprime significa que os dois não têm fator comum diferente de 1.
É estipulado que φ (1) = 1.
As propriedades da função de Euler:
1. Se p é um número primo, então
2. Se a é um número primo e a | x, então
2. Se a e b são relativamente primos, então
Encontre o valor da função de Euler de um número:
Decompor um número em fatores primos:
Pode ser visto na propriedade 1
Portanto, o código é o seguinte:
int phi(int n) {
int res=n;
for(int i=2;i*i<=n;++i) {
if(n%i==0) res=res/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) res=res/n*(n-1);
return res;
}
Combinado com o método de peneira
int phi[maxn];
void init(int n) {
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);
}
}
}
Combine com peneira Euler
int phi[maxn];
int prime[maxn],cnt;
int isnp[maxn];
void init(int n) {
phi[1]=1; cnt=0;
for(int i=2;i<=n;i++)
if(!isnp[i])
prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
isnp[i*prime[j]]=1;
if(i%prime[j]==0) {
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
else phi[prime[j]*i]=phi[i]*phi[prime[j]];
}
}