林老师 · 客观题题库 · CSP-S 卷

CSP-S 卷

CSP-S 真题 2019~2025 · 10 组大题 / 59 小题 · 进阶篇 · 由简到难 · 每小题 2 分 · 建议 90 分钟
真题
复刻
试卷编号OBJ-279595
题目总数10 题 · 135.0 分
试卷类型客观题
考生须知:
① 本卷为客观题单卷,合计 10 题 · 135.0 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 135.0 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

客 观 题

10 QUESTIONS · 2 POINTS EACH
第 1~6 题 阅读程序 (共 14 分) 未作答

1  #include <iostream>
2  #include <cmath>
3  #include <vector>
4  #include <algorithm>
5  using namespace std;
6 
7  long long solve1(int n) {
8      vector<bool> p(n+1, true);
9      vector<long long> f(n+1, 0), g(n+1, 0);
10      f[1] = 1;
11      for (int i = 2; i * i <= n; i++) {
12          if (p[i]) {
13              vector<int> d;
14              for (int k = i; k <= n; k *= i) d.push_back(k);
15              reverse(d.begin(), d.end());
16              for (int k : d) {
17                  for (int j = k; j <= n; j += k) {
18                      if (p[j]) {
19                          p[j] = false;
20                          f[j] = i;
21                          g[j] = k;
22                      }
23                  }
24              }
25          }
26      }
27      for (int i = sqrt(n) + 1; i <= n; i++) {
28          if (p[i]) {
29              f[i] = i;
30              g[i] = i;
31          }
32      }
33      long long sum = 1;
34      for (int i = 2; i <= n; i++) {
35          f[i] = f[i / g[i]] * (g[i] * f[i] - 1) / (f[i] - 1);
36          sum += f[i];
37      }
38      return sum;
39  }
40 
41  long long solve2(int n) {
42      long long sum = 0;
43      for (int i = 1; i <= n; i++) {
44          sum += i * (n / i);
45      }
46      return sum;
47  }
48 
49  int main() {
50      int n;
51      cin >> n;
52      cout << solve1(n) << endl;
53      cout << solve2(n) << endl;
54      return 0;
55  }

假设输入的 nn 是不超过 10000001000000 的自然数,完成下面的判断题和单选题。

1.

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

(1.5 分)
2.

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

(1.5 分)
3.

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

(2 分)
4.

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

(3 分)
5.

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

(3 分)
6.

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

(3 分)
CSP-S 2023 · 阅读程序 第22-27题 | 知识点 差分、约数个数、质因数分解
第 7~12 题 阅读程序 (共 13.5 分) 未作答

1  #include <vector>
2  #include <algorithm>
3  #include <iostream>
4 
5  using namespace std;
6 
7  bool f0(vector<int>& a, int m, int k) {
8      int s = 0;
9      for (int i = 0, j = 0; i < a.size(); i++) {
10          while (a[i] - a[j] > m) j++;
11          s += i - j;
12      }
13      return s >= k;
14  }
15 
16  int f(vector<int>& a, int k) {
17      sort(a.begin(), a.end());
18 
19      int g = 0;
20      int h = a.back() - a[0];
21      while (g < h) {
22          int m = g + (h - g) / 2;
23          if (f0(a, m, k)) {
24              h = m;
25          } else {
26              g = m + 1;
27          }
28      }
29 
30      return g;
31  }
32 
33  int main() {
34      int n, k;
35      cin >> n >> k;
36      vector<int> a(n, 0);
37      for(int i = 0; i < n; i++) {
38          cin >> a[i];
39      }
40      cout<< f(a, k) << endl;
41      return 0;
42  }

假设输入总是合法的,且 a[i]108|a[i]|\le 10^8n10000n\le 100001kn(n1)21\le k\le \frac{n(n-1)}{2},完成下面的判断题和单选题。

7.

将第 2424 行的 m 改为 m - 1,输出有可能不变,而剩下情况为少 11。( )

(1.5 分)
8.

将第 2222 行的 g + (h - g) / 2 改为 (h + g) >> 1,输出不变。( )

(1.5 分)
9.

当输入为 5 7 2 -4 5 1 -3 时,输出为 5。( )

(1.5 分)
10.

设数组 a 中最大值减最小值加 11AA,则函数 f 的时间复杂度为( )。

(3 分)
11.

将第 1010 行中的 > 替换为 >=,那么原输出与现输出的大小关系为( )。

(3 分)
12.

当输入为 5 8 2 -5 3 8 -12 时,输出为( )。

(3 分)
CSP-S 2023 · 阅读程序 第28-33题 | 知识点 倍增、快速排序
第 13~17 题 阅读程序 (共 11.5 分) 未作答

1  #include <iostream>
2  using namespace std;
3 
4  const int N = 1000;
5  int c[N];
6 
7  int logic(int x, int y) {
8      return (x & y) ^ ((x ^ y) | (~x & y));
9  }
10  void generate(int a, int b, int *c) {
11      for (int i = 0; i < b; i++) {
12          c[i] = logic(a, i) % (b + 1);
13      }
14  }
15  void recursion(int depth, int *arr, int size) {
16      if (depth <= 0 || size <= 1) return;
17      int pivot = arr[0];
18      int i = 0, j = size - 1;
19      while (i <= j) {
20          while (arr[i] < pivot) i++;
21          while (arr[j] > pivot) j--;
22          if (i <= j) {
23              int temp = arr[i];
24              arr[i] = arr[j];
25              arr[j] = temp;
26              i++; j--;
27          }
28      }
29      recursion(depth - 1, arr, j + 1);
30      recursion(depth - 1, arr + i, size - i);
31  }
32 
33  int main() {
34      int a, b, d;
35      cin >> a >> b >> d;
36      generate(a, b, c);
37      recursion(d, c, b);
38      for (int i = 0; i < b; ++i) cout << c[i] << " ";
39      cout << endl;
40  }

13.

1000db1000 \ge d \ge b 时,输出的序列是有序的。

(1.5 分)
14.

当输入 5 5 1 时,输出为 1 1 5 5 5

(1.5 分)
15.

假设数组 c 长度无限制,该程序所实现的算法的时间复杂度是 O(b)O(b) 的。

(1.5 分)
16.

函数 int logic(int x, int y) 的功能是( )。

(3 分)
17.

当输入为 10 100 100 时,输出的第 100100 个数是( )。

(4 分)
CSP-S 2024 · 阅读程序 第16-20题 | 知识点 广度优先搜索、广度优先搜索、广度优先搜索、双指针
第 18~23 题 阅读程序 (共 14 分) 未作答

1   #include <iostream>
2  #include <string>
3  using namespace std;
4 
5  const int P = 998244353, N = 1e4+10, M = 20;
6  int n, m;
7  string s;
8  int dp[1<<M];
9 
10  int solve() {
11      dp[0] = 1;
12      for (int i = 0; i < n; ++i) {
13          for (int j = (1<<(m-1))-1; j >= 0; --j) {
14              int k = (j<<1)|(s[i]-'0');
15              if (j != 0 || s[i] == '1')
16                  dp[k] = (dp[k] + dp[j]) % P;
17          }
18      }
19      int ans = 0;
20      for (int i = 0; i < (1<<m); ++i) {
21          ans = (ans + 1ll * i * dp[i]) % P;
22      }
23      return ans;
24  }
25  int solve2() {
26      int ans = 0;
27      for (int i = 0; i < (1<<n); ++i) {
28          int cnt = 0;
29          int num = 0;
30          for (int j = 0; j < n; ++j) {
31              if (i & (1<<j)) {
32                  num = num * 2 + (s[j]-'0');
33                  cnt++;
34              }
35          }
36          if (cnt <= m) (ans += num) %= P;
37      }
38      return ans;
39  }
40 
41  int main() {
42      cin >> n >> m;
43      cin >> s;
44      if (n <= 20) {
45          cout << solve2() << endl;
46      }
47      cout << solve() << endl;
48      return 0;
49  }

假设输入的字符串 ss 是包含 nn 个字符的 0101 串,完成下面的判断题和单选题。

18.

假设数组 dp 长度无限制,函数 solve() 所实现的算法的时间复杂度是 O(n2m)O(n \cdot 2^m)

(1.5 分)
19.

输入 11 2 10000000001 时,程序输出两个数 32322323。( )

(1.5 分)
20.

n10n \leq 10 时,solve() 的返回值始终小于 4104^{10}。( )

(2 分)
21.

n=10n = 10m=10m = 10 时,有多少种输入使得两行的结果完全一致?( )

(3 分)
22.

n6n \leq 6 时,solve() 的最大可能返回值为( )

(3 分)
23.

假设 n=8n = 8m=8m = 8solve()solve2() 的返回值的最大可能差值为( )

(3 分)
CSP-S 2024 · 阅读程序 第21-26题 | 知识点 广度优先搜索、广度优先搜索、广度优先搜索、双指针
第 24~29 题 阅读程序 (共 14.5 分) 未作答

1   #include <iostream>
2  #include <cstring>
3  #include <algorithm>
4  using namespace std;
5 
6  const int maxn = 1000000+5;
7  const int P1 = 998244353, P2 = 1000000007;
8  const int B1 = 2, B2 = 31;
9  const int K1 = 0, K2 = 13;
10 
11  typedef long long ll;
12 
13  int n;
14  bool p[maxn];
15  int p1[maxn], p2[maxn];
16 
17  struct H {
18      int h1, h2, l;
19      H(bool b = false) {
20          h1 = b + K1;
21          h2 = b + K2;
22          l = 1;
23      }
24      H operator + (const H & h) const {
25          H hh;
26          hh.l = l + h.l;
27          hh.h1 = (1ll * h1 * p1[h.l] + h.h1) % P1;
28          hh.h2 = (1ll * h2 * p2[h.l] + h.h2) % P2;
29          return hh;
30      }
31      bool operator == (const H & h) const {
32          return l == h.l && h1 == h.h1 && h2 == h.h2;
33      }
34      bool operator < (const H & h) const {
35          if (l != h.l) return l < h.l;
36          else if (h1 != h.h1) return h1 < h.h1;
37          else return h2 < h.h2;
38      }
39  } h[maxn];
40 
41  void init() {
42      memset(p, 1, sizeof(p));
43      p[0] = p[1] = false;
44      p1[0] = p2[0] = 1;
45      for (int i = 1; i <= n; ++i) {
46          p1[i] = (1ll * B1 * p1[i-1]) % P1;
47          p2[i] = (1ll * B2 * p2[i-1]) % P2;
48          if (!p[i]) continue;
49          for (int j = 2 * i; j <= n; j += i) {
50              p[j] = false;
51          }
52      }
53  }
54 
55  int solve() {
56      for (int i = n; i; --i) {
57          h[i] = H(p[i]);
58          if (2 * i + 1 <= n) {
59              h[i] = h[2 * i] + h[i] + h[2 * i + 1];
60          } else if (2 * i <= n) {
61              h[i] = h[2 * i] + h[i];
62          }
63      }
64      cout << h[1].h1 << endl;
65      sort(h + 1, h + n + 1);
66      int m = unique(h + 1, h + n + 1) - (h + 1);
67      return m;
68  }
69 
70  int main() {
71      cin >> n;
72      init();
73      cout << solve() << endl;
74  }

24.

假设程序运行前能自动将 maxn 改为 n + 1,所实现的算法的时间复杂度是 O(nlogn)O(n \log n)。( )

(1.5 分)
25.

时间开销的瓶颈是 init() 函数。( )

(1.5 分)
26.

若修改常数 B1K1 的值,该程序可能会输出不同的结果。( )

(1.5 分)
27.

solve() 函数中,h[] 的合并顺序可以看作是:( )

(3 分)
28.

输入 10,输出的第一行是?( )

(3 分)
29.

输入 16,输出的第二行是?( )

(4 分)
CSP-S 2024 · 阅读程序 第27-32题 | 知识点 广度优先搜索、广度优先搜索、双指针、二叉树性质
第 30~35 题 阅读程序 (共 13 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  bool flag[27];
5  int n;
6  int p[27];
7  int ans = 0;
8  void dfs(int k) {
9      if (k == n + 1){
10          ++ ans;
11          return;
12      }
13      for (int i = 1; i <= n; ++i) {
14          if (flag[i]) continue;
15          if (k > 1 && i == p[k - 1] + 1) continue;
16          p[k] = i;
17          flag[i] = true;
18          dfs(k + 1);
19          flag[i] = false;
20      }
21      return;
22  }
23  int main() {
24      scanf("%d", &n);
25      dfs(1);
26      printf("%d\n", ans);
27      return 0;
28  }

30.

当输入的 n=3n=3 的时候,程序输出的答案为 33

(1 分)
31.

dfs 函数运行过程中,k 的取值会满足 1kn+11 \le k \le n+1

(1.5 分)
32.

删除第 1919 行的 flag[i]=false;,对答案不会产生影响。

(1.5 分)
33.

当输入的 n=4n=4 的时候,程序输出的答案为( )。

(3 分)
34.

如果因为某些问题,导致程序运行第 2525 行的 dfs 函数之前,数组 p 的初值并不全为 00,则对程序的影响是( )。

(3 分)
35.

假如删去第 1414 行的 if(flag[i])continue;,输入 33,得到的输出答案是( )。

(3 分)
CSP-S 2025 · 阅读程序 第16-21题 | 知识点 计数排序、归并排序、数组越界、插空法
第 36~41 题 阅读程序 (共 13.5 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #define ll long long
5  int cnt_broken = 0;
6  int cnt_check = 0;
7  int n, k;
8  inline bool check(int h) {
9      printf("now check:%d\n", h);
10      ++cnt_check;
11      if (cnt_broken == 2) {
12          printf("You have no egg!\n");
13          return false;
14      }
15      if (h >= k) {
16          ++cnt_broken;
17          return true;
18      } else {
19          return false;
20      }
21  }
22  inline bool assert_ans(int h) {
23      if (h == k) {
24          printf("You are Right using %d checks\n", cnt_check);
25          return true;
26      } else {
27          printf("Wrong answer!\n");
28          return false;
29      }
30  }
31  inline void guess1(int n) {
32      for (int i = 1; i <= n; ++i) {
33          if (check(i)) {
34              assert_ans(i);
35              return;
36          }
37      }
38  }
39  inline void guess2(int n) {
40      int w = 0;
41      for (w = 1; w * (w + 1) / 2 < n; ++w)
42      ;
43      for (int ti = w, nh = w;; --ti, nh += ti, nh = std::min(nh, n)) {
44          if (check(nh)) {
45              for (int j = nh - ti + 1; j < nh; ++j) {
46                  if (check(j)) {
47                      assert_ans(j);
48                      return;
49                  }
50              }
51              assert_ans(nh);
52              return;
53          }
54      }
55  }
56  int main() {
57      scanf("%d%d", &n, &k);
58      int t;
59      scanf("%d", &t);
60      if (t == 1) {
61          guess1(n);
62      } else {
63          guess2(n);
64      }
65      return 0;
66  }

36.

当输入为 6 5 1 时,猜测次数为 55;当输入 6 5 2 时,猜测次数为 33

(1.5 分)
37.

不管输入的 nnkk 具体为多少,t=2t=2 时的猜测数总是小于等于 t=1t=1 时的猜测数。

(1.5 分)
38.

不管 t=1t=1t=2t=2,程序都一定会猜到正确结果。

(1.5 分)
39.

函数 guess1 在运行过程中,cnt_broken 的值最多为( )。

(3 分)
40.

函数 guess2 在运行过程中,最多使用的猜测次数的量级为( )。

(3 分)
41.

当输入的 n=100n=100 的时候,代码中 t=1t=1t=2t=2 分别需要的猜测次数最多分别为( )。

(3 分)
CSP-S 2025 · 阅读程序 第22-27题 | 知识点 排序稳定性、初等代数、二分查找
第 42~47 题 阅读程序 (共 13 分) 未作答

完成下面的判断题和单选题。

1  #include <iostream>
2  using namespace std;
3 
4  const int maxn = 1000;
5  int n;
6  int fa[maxn], cnt[maxn];
7 
8  int getRoot(int v) {
9      if (fa[v] == v) return v;
10      return getRoot(fa[v]);
11  }
12 
13  int main() {
14      cin >> n;
15      for (int i = 0; i < n; ++i) {
16          fa[i] = i;
17          cnt[i] = 1;
18      }
19      int ans = 0;
20      for (int i = 0; i < n - 1; ++i) {
21          int a, b, x, y;
22          cin >> a >> b;
23          x = getRoot(a);
24          y = getRoot(b);
25          ans += cnt[x] * cnt[y];
26          fa[x] = y;
27          cnt[y] += cnt[x];
28      }
29      cout << ans << endl;
30      return 0;
31  }

42.

输入的 ab 值应在 [0,n1][0,n-1] 的范围内。( )

(1 分)
43.

1616 行改成 fa[i] = 0;,不影响程序运行结果。( )

(1 分)
44.

若输入的 ab 值均在 [0,n1][0,n-1] 的范围内,则对于任意 0i<n0\le i<n,都有 0fa[i]<n0\le fa[i]<n。( )

(1.5 分)
45.

若输入的 ab 值均在 [0,n1][0,n-1] 的范围内,则对于任意 0i<n0\le i<n,都有 1cnt[i]n1\le cnt[i]\le n。( )

(1.5 分)
46.

n=50n=50 时,若 ab 的值都在 [0,49][0,49] 的范围内,且在第 2525 行时 x 总是不等于 y,那么输出为( )。

(4 分)
47.

此程序的时间复杂度是( )。

(4 分)
CSP-S 2019 · 阅读程序 第22-27题 | 知识点 图的BFS遍历、归并排序
第 48~53 题 阅读程序 (共 14.5 分) 未作答

1  #include <iostream>
2  #include <string>
3  using namespace std;
4 
5  char base[64];
6  char table[256];
7 
8  void init()
9  {
10      for (int i = 0; i < 26; i++) base[i] = 'A' + i;
11      for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i;
12      for (int i = 0; i < 10; i++) base[52 + i] = '0' + i;
13      base[62] = '+', base[63] = '/';
14 
15      for (int i = 0; i < 256; i++) table[i] = 0xff;
16      for (int i = 0; i < 64; i++) table[base[i]] = i;
17      table['='] = 0;
18  }
19 
20  string encode(string str)
21  {
22      string ret;
23      int i;
24      for (i = 0; i + 3 <= str.size(); i += 3) {
25          ret += base[str[i] >> 2];
26          ret += base[(str[i] & 0x03) << 4 | str[i + 1] >> 4];
27          ret += base[(str[i + 1] & 0x0f) << 2 | str[i + 2] >> 6];
28          ret += base[str[i + 2] & 0x3f];
29      }
30      if (i < str.size()) {
31          ret += base[str[i] >> 2];
32          if (i + 1 == str.size()) {
33              ret += base[(str[i] & 0x03) << 4];
34              ret += "==";
35          }
36          else {
37              ret += base[(str[i] & 0x03) << 4 | str[i + 1] >> 4];
38              ret += base[(str[i + 1] & 0x0f) << 2];
39              ret += "=";
40          }
41      }
42      return ret;
43  }
44 
45  string decode(string str)
46  {
47      string ret;
48      int i;
49      for (i = 0; i < str.size(); i += 4) {
50          ret += table[str[i]] << 2 | table[str[i + 1]] >> 4;
51          if (str[i + 2] != '=')
52              ret += (table[str[i + 1]] & 0x0f) << 4 | table[str[i + 2]] >> 2;
53          if (str[i + 3] != '=')
54              ret += table[str[i + 2]] << 6 | table[str[i + 3]];
55      }
56      return ret;
57  }
58 
59  int main()
60  {
61      init();
62      cout << int(table[0]) << endl;
63 
64      int opt;
65      string str;
66      cin >> opt >> str;
67      cout << (opt ? decode(str) : encode(str)) << endl;
68      return 0;
69  }

假设输入总是合法的(一个整数和一个不含空白字符的字符串,用空格隔开),完成下面的判断题和单选题。

48.

程序总是先输出一行一个整数,再输出一行一个字符串。( )

(1.5 分)
49.

对于任意不含空白字符的字符串 str1,先执行程序输入 0 str1,得到输出的第二行记为 str2;再执行程序输入 1 str2,输出的第二行必为 str1。( )

(1.5 分)
50.

当输入为 1 SGVsbG93b3JsZA== 时,输出的第二行为 HelloWorld。( )

(1.5 分)
51.

设输入字符串长度为 nnencode 函数的时间复杂度为( )。

(3 分)
52.

输出的第一行为( )。

(3 分)
53.

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

(4 分)
CSP-S 2021 · 阅读程序 第28-33题 | 知识点 if-else、广度优先搜索、广度优先搜索、广度优先搜索
第 54~59 题 阅读程序 (共 13.5 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #include <vector>
5  #define ll long long
6  int n, m;
7  std::vector<int> k, p;
8  inline int mpow(int x, int k) {
9      int ans = 1;
10      for (; k; k = k >> 1, x = x * x) {
11          if (k & 1)
12          ans = ans * x;
13      }
14      return ans;
15  }
16  std::vector<int> ans1, ans2;
17  int cnt1, cnt2;
18  inline void dfs(std::vector<int>& ans, int& cnt, int l, int r, int v) {
19      if (l > r) {
20          ++cnt;
21          ans.push_back(v);
22          return;
23      }
24      for (int i = 1; i <= m; ++i) {
25          dfs(ans, cnt, l + 1, r, v + k[l] * mpow(i, p[l]));
26      }
27      return;
28  }
29  std::vector<int> cntans1;
30  int main() {
31      scanf("%d%d", &n, &m);
32      k.resize(n + 1);
33      p.resize(n + 1);
34      for (int i = 1; i <= n; ++i) {
35          scanf("%d%d", &k[i], &p[i]);
36      }
37      dfs(ans1, cnt1, 1, n >> 1, 0);
38      dfs(ans2, cnt2, (n >> 1) + 1, n, 0);
39      std::sort(ans1.begin(), ans1.end());
40      int newcnt1 = 1;
41      cntans1.push_back(1);
42      for (int i = 1; i < cnt1; ++i) {
43          if (ans1[i] == ans1[newcnt1 - 1]) {
44              ++cntans1[newcnt1 - 1];
45          } else {
46              ans1[newcnt1++] = ans1[i];
47              cntans1.push_back(1);
48          }
49      }
50      cnt1 = newcnt1;
51      std::sort(ans2.begin(), ans2.end());
52      int las = 0;
53      ll ans = 0;
54      for (int i = cnt2 - 1; i >= 0; --i) {
55          for (; las < cnt1 && ans1[las] + ans2[i] < 0; ++las)
56          ;
57          if (las < cnt1 && ans1[las] + ans2[i] == 0)
58          ans += cntans1[las];
59      }
60      printf("%lld\n", ans);
61      return 0;
62  }

54.

删除第 5151 行的 std::sort(ans2.begin(), ans2.end()); 后,代码输出的结果不会受到影响。

(1.5 分)
55.

假设计算过程中不发生溢出,函数 mpow(x, k) 的功能是求出 xkx^k 的取值。( )

(1.5 分)
56.

代码中第 3939 行到第 5050 行的目的是为了将 ans1 数组进行"去重"操作。( )

(1.5 分)
57.

当输入为 3 15 1 2 -1 2 1 2 时,输出结果为( )

(3 分)
58.

记程序结束前 p 数组元素的最大值为 PP,则该代码的时间复杂度是( )

(3 分)
59.

本题所求出的是( )。

(3 分)
CSP-S 2025 · 阅读程序 第28-33题 | 知识点 模拟、选择排序、基数排序、剪枝