1.某神犇Blog 学了三遍的 欧拉函数φ--DEADFISH7
2.我要做一些补充o(* ̄▽ ̄*)o
$φ(1)=1$;
公式有两种形式,一种有太多除法,实际可能会慢些。通用
对于任意$n$>1,1~$n$中与$n$互质的数之和等于$n*φ(n)/2$。
是积性函数。
$sigma(d|n) φ(d)=n$。
代码实现
1°:朴素的质因数分解顺便求出
void init_phi() { int ans=n; for(int i=2;i<=sqrt(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); } }
适用于单个查询的情况,但是效率有点低,$O(sqrt(n))$,嘤。
2°:线性筛素数,顺便把欧拉函数也整出来。(适用于递推,连续1~n)
在线性筛板子上稍加修改即可,复杂度$O(n)$。
void init_phi() { phi[1]=1; for(int i=2;i<=lim;i++) { if(v[i]==0) { prime[++m]=i; v[i]=i; phi[i]=i-1; } for(int j=1;j<=m;j++) { if(prime[j]>v[i]||prime[j]>lim/i) break; v[i*prime[j]]=prime[j]; phi[i*prime[j]]=phi[i]*(i%prime[j] ? prime[j]-1 :prime[j]); } } }
例题 仪仗队