线性筛欧拉函数
由 \(\varphi(ab)=\varphi(a)\varphi(b)(\gcd(a,b)=1)\) 得。
因为线性筛对于每个合数,由它的最小质因子 \(p_1\) 筛,设 \(n'=\frac{n}{p1}\)。
首先如果 \(n' \bmod p_1 \ne 0\),因为 \(p_1\) 是质数,所以 \(\varphi(n)=\varphi(n')\varphi(p_1)=(p_1-1)\varphi(n')\)。
否则 \(n'\) 有 \(n\) 的所有质因子,所以:
\[\large
\begin{aligned}
\varphi(n)&=n \prod_{i\in S_{n}} \frac{i-1}{i}\\
\varphi(n)&=p_1 \times n' \prod_{i\in S_{n'}} \frac{i-1}{i}\\
\varphi(n)&=p_1 \varphi(n')
\end{aligned}
\]
参考代码:
const int EU = ;
int st[EU], phi[EU], sumphi[EU];
vector<int> prs;
void init(int n) {
phi[1] = 1;
upp(i, 2, n) {
if (!st[i]) {
prs.push_back(i);
phi[i] = i - 1;
}
for (int j = 0; prs[j] <= n / i; j++) {
st[i * prs[j]] = 1;
if (i % prs[j] == 0) {
phi[i * prs[j]] = prs[j] * phi[i];
break;
} else
phi[i * prs[j]] = (prs[j] - 1) * phi[i];
}
}
upp(i, 1, n) sumphi[i] = sumphi[i - 1] + phi[i];
return;
}

浙公网安备 33010602011771号