1.欧拉函数证明
欧拉函数:对于一个正整数n,在1~n中与n互质的数的个数
对于正整数 n, p1,p2,⋯,pk是n的k个质因子
欧拉函数的公式如下:
phi(n) = n × (1 - p11) × (1 - p21) × ⋯ × (1 - pk1) ①
那么对于另一种方式:由于唯一分解定理,我们可以考虑将这 k个质因子的所有倍数筛去,那么得到的结果就是欧拉函数
phi(n)= n − p1n − p2n − p3n − ⋯ − pkn + p1∗p2n + ⋯ + pn−1∗pnn − 奇数个质因子相乘n + 偶数个质因子相乘n ⋯②
将①式展开会发现与②式相同,所以得证
2.欧拉线性筛
对于多组询问如果每次都调用欧拉函数则会超时,所以预处理出一部分的欧拉函数就显得很有必要了。
① 对于质数,其欧拉函数为值减 1,如 phi(5)=5−1=4
② 当 i % pri[j]==0, 我们可以发现i中存在 pri[j],因此令 t =i ∗ pri[j],则 phi(t)=phi(i) ∗ pri[j]
③ 当 i % pri[j]!= 0,我们发现i中不存在 pri[j],仍然令 t = i ∗ pri[j],则 phi(t) = phi(i) * pri[j] * ( 1 − pri[j]1)
即 phi(t) = phi(i) ∗ ( pri[j]−1)
int phi[N];
int pri[N], cnt; bool st[N];
void Euler(int n){
phi[1] = 1;
for(int i = 2; i <= n; i++){
if(!st[i]) {
pri[cnt++] = i;
phi[i] = i - 1;
}
for(int j = 0; j < cnt && i <= n / pri[j]; j++){
st[i * pri[j]] = true;
if(i % pri[j] == 0) {phi[i * pri[j]] = phi[i] * pri[j]; break;}
else phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
}