UVA1730 Sum of MSLCM

题目大意

定义 MALCM(i)=did\operatorname{MALCM}(i)=\sum\limits_{d|i}d

i=2nMSLCM(i)\sum\limits_{i=2}^{n}\operatorname{MSLCM}(i)

1n200000001 \leq n\leq 20000000

解题思路

显然,MSLCM(n)\operatorname{MSLCM}(n) 等价于 nn 的约数和。

那么线性筛即可。

时间复杂度 O(n)\mathcal{O}(n)

CODE

#include <bits/stdc++.h>

using namespace std;

long long f[20000007], g[20000007], p[20000007], tot, n;

bool v[20000007];

void init(int n)
{
    g[1] = f[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (!v[i])
            v[i] = 1, p[++tot] = i, g[i] = i + 1, f[i] = i + 1;
        for (int j = 1; j <= tot && i <= n / p[j]; ++j)
        {
            v[p[j] * i] = 1;
            if (!(i % p[j]))
            {
                g[i * p[j]] = g[i] * p[j] + 1;
                f[i * p[j]] = f[i] / g[i] * g[i * p[j]];
                break;
            }
            else
                f[i * p[j]] = f[i] * f[p[j]], g[i * p[j]] = 1 + p[j];
        }
    }
    for (int i = 1; i <= n; i++)
        f[i] = f[i - 1] + f[i];
}

signed main()
{
    init(20000000);
    while (cin >> n && n)
        cout << f[n] - 1 << '\n';
    return 0;
}
posted @ 2021-12-18 19:34  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源