欧拉函数
铺垫
积性函数
\[f(x) \times f(y) = f(xy)
\]
互质
\[(a, b) = 1
\]
欧拉函数:\(\phi(x)\)
- 含义:\(\phi(x)\) 小于 \(x\) 且与 \(x\) 互质的数的个数
- 积性函数:\(\phi(x) \times \phi(y) = \phi(xy)\)
- 特例 \(\phi(p) = p - 1\) (当 \(p\) 为质数)
公式:
\(\phi(x) = x(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_n})\)
证明:
不妨设 \(x\) = \(p_1^{k_1}·p_2^{k_2}·...·p_n^{k_n}\)
则 \(\phi(x) = \phi(p_1^{k_1} - p_1^{k_1 - 1})·...·\phi(p_n^{k_n} - p_n^{k_n - 1})\)
\(=p_1^{k_1} \times ...\times p_n^{k_n} \times (1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_n})\)
\(=x(1 - \frac{1}{p_1})(1 - \frac{1}{p_2})...(1 - \frac{1}{p_n})\)
筛欧拉函数
基本思路同素数筛(埃氏筛)
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int o[100010];
void ola(int x){
for(int i = 1; i <= x; i ++) o[i] = i;//每个数都先赋值成自己
for(int i = 2; i <= x; i ++){
if(o[i] == i){
for(int j = i; j <= x; j += i){
o[j] = o[j] / i * (i - 1);//给这些含有这个素数的数筛上一遍
}
}
}
}
int main(){
scanf("%d", &n);
ola(n);
for(int i = 1; i <= n; i ++){
printf("%d:%d\n", i, o[i]);
}
return 0;
}