欧拉函数是对于一个数 \(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);
}
}
}
标签:phi,frac,函数,times,因子,欧拉
From: https://www.cnblogs.com/0x3F/p/17049042.html