1 条题解

  • 0
    @ 2023-4-20 21:02:00
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 40005;
    //pri[1]~pri[cnt]
    int pri[MAXN], phi[MAXN], cnt;
    bool vis[MAXN];
    void init()
    {
        phi[1] = 1;
        for (int i = 2; i < MAXN; ++i)
        {
            if (!vis[i])
            {
                phi[i] = i - 1;
                pri[cnt++] = i;
            }
            for (int j = 0; j < cnt; ++j)
            {
                if (1ll * i * pri[j] >= MAXN)
                    break;
                vis[i * pri[j]] = 1;
                if (i % pri[j])
                {
                    phi[i * pri[j]] = phi[i] * (pri[j] - 1);
                }
                else
                {
                    // i % pri[j] == 0
                    // 换言之,i 之前被 pri[j] 筛过了
                    // 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定也是
                    // pri[j] 的倍数 它们都被筛过了,就不需要再筛了,所以这里直接 break
                    // 掉就好了
                    phi[i * pri[j]] = phi[i] * pri[j];
                    break;
                }
            }
        }
    }
    int n, q, x;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        if (n == 1)
        {
            cout << 0 << endl;
            return 0;
        }
        init();
        int ans = 0;
        for (int i = 1; i < n; i++)
            ans += phi[i];
        cout << ans * 2 + 1 << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    1268
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    31
    已通过
    14
    上传者