题库 信息学奥赛题库 题目列表 #include <iostream> #include <c...
组合题

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
long long solve1(int n) {
    vector<bool> p(n + 1, true);
    vector<long long> f(n + 1, 0), g(n + 1, 0);
    f[1] = 1;
    for (int i = 2; i * i <= n; i++) {
        if (p[i]) {
            vector<int> d;
            for (int k = i; k <= n; k *= i)
                d.push_back(k);
            reverse(d.begin(), d.end());
            for (int k : d) {
                for (int j = k; j <= n; j += k) {
                    if (p[j]) {
                        p[j] = false;
                        f[j] = i;
                        g[j] = k;
                    }
                }
            }
        }
    }
    for (int i = sqrt(n) + 1; i <= n; i++) {
        if (p[i]) {
            f[i] = i;
            g[i] = i;
        }
    }
    long long sum = 1;
    for (int i = 2; i <= n; i++) {
        f[i] = f[i / g[i]] * (g[i] * f[i] - 1) / (f[i] - 1);
        sum += f[i];
    }
    return sum;
}
long long solve2(int n) {
    long long sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i * (n / i);
    }
    return sum;
}
int main() {
    int n;
    cin >> n;
    cout << solve1(n) << endl;
    cout << solve2(n) << endl;
    return 0;
}

假设输入的 n 是不超过 1000000 的自然数,完成下面的判断题和单选题:

第1题 判断

将第 15 行删去,输出不变。()

A.
正确
B.
错误
第2题 判断

当输入为 10 时,输出的第一行大于第二行。()

A.
正确
B.
错误
第3题 判断

 当输入为 1000 时,输出的第一行与第二行相等。()

A.
正确
B.
错误
第4题 单选

solve1(n) 的时间复杂度为()。

A.

O(nlog2n)

B.

O(n)

C.

O(nlogn)

D.

O(nloglogn)

第5题 单选

solve2(n) 的时间复杂度为()。

A.

O(n2)

B.

O(n)

C.

O(nlogn)

D.

O(nn)

第6题 单选

当输入为 5 时,输出的第二行为()。

A.

20

B.

21

C.

22

D.

23

题目信息
选择题 2023年 初赛
-
正确率
0
评论
54
点击
QQ
微信