欧拉函数

欧拉函数是对于一个数 \(N\),在 \(1-N\) 范围内所有与 \(N\) 互质的数的个数。
欧拉函数需要通过线性筛实现:
如果 \(i\) 为素数,显然 \(\phi(i) = i - 1\)
否则考虑 \(\phi(i)\)\(\phi(i\times p_j)\) 的关系:
\(\phi(i)=i {\textstyle \prod_{}^{}} (1-\frac{1}{p_k})\)
如果 \(p_j\)\(i\) 的最小质因子,那么 \(i\times p_j\) 中一定有 \(i\) 一定有 \(p_j\) 这个因子,
\(\phi(i\times p_j) = i \times p_j{\textstyle \prod_{}^{}}(1-\frac{1}{p_k})=\phi(i)\times p_j\)
如果 \(p_j\) 不是 \(i\) 的最小因子那么它一定不整除 \(i\) 但是一定整除 \(i*p_j\)
\(\phi(i\times p_j) = p_j \times (1-\frac{1}{p_j})\times \phi(i)=\phi(i)\times(p_j - 1)\)
可以在筛素数的时候处理欧拉函数。

void Get_phi(int n){
	phi[1] = 1;
	a[1] = a[0] = false;
	for(int i=2;i<=n;i++){
		if(!a[i]){
			prime[++cnt] = i;
			phi[i] = i - 1;
		}
		for(int j=1;j <= cnt && i * prime[j] <= n;j++){
			a[i * prime[j]] = true;
			if(i % prime[j] == 0){
				phi[i*prime[j]] = phi[i] * prime[j];
				break;
			}
			phi[i*prime[j]] = phi[i] * (prime[j] - 1);
		}
	}
}
posted @ 2023-01-13 11:08  0xFF_qwq  阅读(27)  评论(0)    收藏  举报