线性筛欧拉函数

\(\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;
}
posted @ 2025-05-11 19:55  PM_pro  阅读(19)  评论(0)    收藏  举报