Just Wait...

欧拉函数

铺垫

积性函数

\[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;
} 
posted @ 2025-08-30 17:51  Hty111  阅读(3)  评论(0)    收藏  举报