abc172D 約數之和

chenfy27發表於2024-03-09

題面:記f(x)表示x的約數個數,例如,12的約數有1,2,3,4,6,12共6個,因此f(12)=6。給定n,求\(\sum_{k=1}^{n}k*f(k)\)
範圍:n<=1E7

思路:用類似素數篩的做法預處理出所有f,然後遍歷一次得到答案,時間複雜度O(nloglogn)。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

const int N = 10000005;
int cnt[N];
void init(int n) {
    cnt[1] = 1;
    rep(i,2,n) {
        cnt[i] += 1;
        for (int j = i; j <= n; j += i) {
            cnt[j] += 1;
        }
    }
}

void solve() {
    int n;
    cin >> n;
    init(n);
    int ans = 0;
    rep(i,1,n) {
        ans += i * cnt[i];
    }
    cout << ans << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

相關文章