2023年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)

2023年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)

第 2 题
cpp 复制代码
#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. (2 分) 当输入为 1000 时,输出的第一行与第二行相等。()

    A. 正确 B. 错误

单选题
  1. solve1(n) 的时间复杂度为()。

    A. O(nlog⁡ 2 ^2 2n) B. O(n) C. O(nlog⁡n) D. O(nlog⁡log⁡n)

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

    A. O(n 2 ^2 2) B. O(n) C. O(nlog⁡n) D. O(n n ) \sqrt{n}) n ))

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

    A. 20 B. 21 C. 22 D. 23

代码分析
  • solve1(n) 通过筛法标记每个数的最小质因数及其最高幂次,再利用公式递推计算除数之和 σ ( i ) \sigma(i) σ(i),最后求和。
  • solve2(n) 直接计算 ∑ i = 1 n i × ⌊ n / i ⌋ \sum_{i=1}^n i \times \lfloor n/i \rfloor ∑i=1ni×⌊n/i⌋,该和式等价于 ∑ k = 1 n σ ( k ) \sum_{k=1}^n \sigma(k) ∑k=1nσ(k)。
  • 两函数计算结果相同,时间复杂度分别为 O ( n log ⁡ log ⁡ n ) O(n \log \log n) O(nloglogn) 和 O ( n ) O(n) O(n)。
判断题答案
  1. B. 错误

    删去第15行(reverse(d.begin(), d.end());)后,di的幂次变为从小到大排列,会导致g[j]被错误地赋值为较小的幂次,进而使得后续计算的f[i](即除数之和)错误,输出改变。

  2. B. 错误
    solve1(n)solve2(n)均计算 1 1 1 到 n n n 所有数的除数之和 ∑ k = 1 n σ ( k ) \sum_{k=1}^n \sigma(k) ∑k=1nσ(k),因此两行输出相等。当输入为 10 时,第一行等于第二行。

  3. A. 正确

    同理,当输入为 1000 时,两行输出相等。

单选题答案
  1. D. O(nloglogn)
    solve1(n) 的第一部分类似于筛法,仅处理 ≤ n \leq \sqrt{n} ≤n 的质数及其幂次,遍历倍数的总次数约为 n ∑ p ≤ n 1 / p = O ( n log ⁡ log ⁡ n ) n \sum_{p \leq \sqrt{n}} 1/p = O(n \log \log n) n∑p≤n 1/p=O(nloglogn),其余部分为 O ( n ) O(n) O(n),故总时间复杂度为 O ( n log ⁡ log ⁡ n ) O(n \log \log n) O(nloglogn)。

  2. B. O(n)
    solve2(n) 通过单层循环计算,循环次数为 n n n,每次操作 O ( 1 ) O(1) O(1),故时间复杂度为 O ( n ) O(n) O(n)。

  3. B. 21

    当输入为 5 时,solve2(5) 计算过程为:
    1 × ⌊ 5 / 1 ⌋ + 2 × ⌊ 5 / 2 ⌋ + 3 × ⌊ 5 / 3 ⌋ + 4 × ⌊ 5 / 4 ⌋ + 5 × ⌊ 5 / 5 ⌋ = 5 + 4 + 3 + 4 + 5 = 21 1 \times \lfloor 5/1 \rfloor + 2 \times \lfloor 5/2 \rfloor + 3 \times \lfloor 5/3 \rfloor + 4 \times \lfloor 5/4 \rfloor + 5 \times \lfloor 5/5 \rfloor = 5 + 4 + 3 + 4 + 5 = 21 1×⌊5/1⌋+2×⌊5/2⌋+3×⌊5/3⌋+4×⌊5/4⌋+5×⌊5/5⌋=5+4+3+4+5=21。


专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
博客18008 小时前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴10 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4565 天前
C++进阶(1)——前景提要
c++
夜悊5 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴5 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0016 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾6 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you6 天前
constexpr函数
c++
凡人叶枫6 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++