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;
}
相关推荐
汉克老师3 小时前
GESP6级C++考试语法知识(四、图与树(四))
c++·贪心算法·优先队列·哈夫曼编码·哈夫曼树·gesp6级·gesp六级
子兮曰4 小时前
whisper.cpp 深度解析:从边缘设备到实时语音识别
前端·c++·后端
特种加菲猫4 小时前
二叉搜索树:数据世界的“快速寻路指南”
开发语言·c++
naturerun4 小时前
从数组中删除元素的算法
数据结构·c++·算法
特种加菲猫4 小时前
STL关联容器:Set/Multiset与Map/Multimap详解
开发语言·c++
Andy5 小时前
C++ list容器基本逻辑结构详解
c++·windows·list
想唱rap6 小时前
传输层协议TCP
linux·运维·服务器·网络·c++·tcp/ip
瑶池酒剑仙6 小时前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
潇湘散客7 小时前
CAX软件插件化设计实现牛刀小试
c++·算法·图形学·opengl
Ricky_Theseus7 小时前
const 和 #define 的区别
c++