fpiaopiao

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目描述

输入一个数n,输出前n个数约数的和。(约数是指若整数a除以整数b除得的商正好是整数而没有余数)

输入

输入一个整数n。

输出

输出一个整数。

样例输入 复制

7

样例输出 复制

41

思路:暴力时间N方复杂度过不了,使用线性筛选:
具体来说,我们可以使用一个数组sum,其中sum[i]表示正整数i的约数和。然后,我们可以从小到大遍历每个数i,如果i是质数,那么它的所有倍数j的约数和应该增加i,即sum[j] += i。如果i不是质数,那么它的所有因子p应该已经被遍历过了,它们的倍数j已经在之前的遍历中被更新过了,所以i不需要再更新任何数的约数和。
代码:
#include <iostream>
#include <vector>
#define ll long long
using namespace std;

int main() {
    int n;
    cin >> n; // 输入n
    vector<ll> sum(n + 1, 0); // 初始化sum数组
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j += i) {
            sum[j] += i; // 累加i作为j的约数
        }
    }
    ll sums = 0;
    for (int i = 1; i <= n; i++) {
        sums += sum[i];
    }
    cout << sums << endl;
    return 0;
}

 

posted on 2023-04-05 21:21  _fanfan  阅读(44)  评论(0编辑  收藏  举报