2026年6月GESP真题及题解(C++八级): 选择题和判断题(题解)

2026年6月GESP真题及题解(C++八级): 选择题和判断题(题解)

选择题

第1题

题目: 从7本不同的算法书和5本不同的数学书中选出4本,要求两类书都至少选1本,共有( )种不同选法。

A. 420

B. 455

C. 465

D. 495

答案: B

解析:

总的选法数为

( 12 4 ) = 495 \binom{12}{4}=495 (412)=495

只选算法书的选法为

( 7 4 ) = 35 \binom{7}{4}=35 (47)=35

只选数学书的选法为

( 5 4 ) = 5 \binom{5}{4}=5 (45)=5

所以两类书都至少选1本的选法为

495 − 35 − 5 = 455 495-35-5=455 495−35−5=455


第2题

题目: 6个人排成一排照相,其中甲、乙两人不能相邻,共有( )种不同排法。

A. 240

B. 480

C. 600

D. 720

答案: B

解析:

6个人全排列有

6 ! = 720 6!=720 6!=720

种。

甲、乙相邻时,把甲、乙看成一个整体,有 2 ! 2! 2! 种内部排法,整体与其余4人共5个对象排列,有 5 ! 5! 5! 种,因此相邻排法为

2 ! × 5 ! = 2 × 120 = 240 2!\times 5!=2\times120=240 2!×5!=2×120=240

所以不相邻排法为

720 − 240 = 480 720-240=480 720−240=480


第3题

题目: 展开式 ( x 2 − 1 x ) 6 \left(x^2-\frac{1}{x}\right)^6 (x2−x1)6 中,常数项的系数为( )。

A. 6

B. 12

C. 15

D. 20

答案: C

解析:

二项展开通项为

T k + 1 = ( 6 k ) ( x 2 ) 6 − k ( − 1 x ) k = ( 6 k ) ( − 1 ) k x 12 − 3 k T_{k+1}=\binom{6}{k}(x^2)^{6-k}\left(-\frac{1}{x}\right)^k =\binom{6}{k}(-1)^k x^{12-3k} Tk+1=(k6)(x2)6−k(−x1)k=(k6)(−1)kx12−3k

要求常数项,则

12 − 3 k = 0 ⇒ k = 4 12-3k=0 \Rightarrow k=4 12−3k=0⇒k=4

所以常数项系数为

( 6 4 ) ( − 1 ) 4 = 15 \binom{6}{4}(-1)^4=15 (46)(−1)4=15


第4题

题目: 下面代码用于预处理组合数,横线处应填入的是( )。

cpp 复制代码
for (int i = 0; i <= n; i++) {
    c[i][0] = c[i][i] = 1;
    for (int j = 1; j < i; j++)
        c[i][j] = ________;
}

A. c[i-1][j-1] + c[i-1][j]

B. c[i][j-1] + c[i-1][j-1]

C. c[i-1][j] + c[i][j+1]

D. c[i][j-1] * c[i-1][j]

答案: A

解析:

组合数满足帕斯卡公式:

( i j ) = ( i − 1 j − 1 ) + ( i − 1 j ) \binom{i}{j}=\binom{i-1}{j-1}+\binom{i-1}{j} (ji)=(j−1i−1)+(ji−1)

即

cpp 复制代码
c[i][j] = c[i-1][j-1] + c[i-1][j];

第5题

题目: 下列程序输出的值为( )。

cpp 复制代码
#include <iostream>
using namespace std;

long long qpow(long long a, long long b, long long mod) {
    long long ans = 1 % mod;
    while (b) {
        if (b & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}

int main() {
    cout << qpow(3, 20, 17) << endl;
    return 0;
}

A. 1

B. 4

C. 13

D. 16

答案: C

解析:

计算 3 20   m o d   17 3^{20}\bmod 17 320mod17。

3 4 = 81 ≡ 13 ( m o d 17 ) 3^4=81\equiv 13\pmod{17} 34=81≡13(mod17)

3 8 ≡ 13 2 = 169 ≡ 16 ≡ − 1 ( m o d 17 ) 3^8\equiv 13^2=169\equiv 16\equiv -1\pmod{17} 38≡132=169≡16≡−1(mod17)

3 16 ≡ ( − 1 ) 2 = 1 ( m o d 17 ) 3^{16}\equiv (-1)^2=1\pmod{17} 316≡(−1)2=1(mod17)

所以

3 20 = 3 16 ⋅ 3 4 ≡ 1 ⋅ 13 = 13 ( m o d 17 ) 3^{20}=3^{16}\cdot 3^4\equiv 1\cdot 13=13\pmod{17} 320=316⋅34≡1⋅13=13(mod17)

输出为 13 13 13。


第6题

题目: 归并排序每次把长度为 n n n 的序列分成两个规模约为 n / 2 n/2 n/2 的子序列,递归排序后再用线性时间合并。该算法的时间复杂度通常为( )。

A. O ( n ) O(n) O(n)

B. O ( n 2 ) O(n^2) O(n2)

C. O ( log ⁡ n ) O(\log n) O(logn)

D. O ( n log ⁡ n ) O(n\log n) O(nlogn)

答案: D

解析:

归并排序的递归式为

T ( n ) = 2 T ( n 2 ) + O ( n ) T(n)=2T\left(\frac{n}{2}\right)+O(n) T(n)=2T(2n)+O(n)

由主定理可得

T ( n ) = O ( n log ⁡ n ) T(n)=O(n\log n) T(n)=O(nlogn)


第7题

题目: 在平面直角坐标系中,三角形三个顶点为 A ( 1 , 1 ) A(1,1) A(1,1)、 B ( 5 , 2 ) B(5,2) B(5,2)、 C ( 3 , 6 ) C(3,6) C(3,6),该三角形面积为( )。

A. 9

B. 10

C. 12

D. 18

答案: A

解析:

利用向量叉积求面积:

A B → = ( 4 , 1 ) , A C → = ( 2 , 5 ) \overrightarrow{AB}=(4,1),\quad \overrightarrow{AC}=(2,5) AB =(4,1),AC =(2,5)

叉积绝对值为

∣ 4 × 5 − 1 × 2 ∣ = ∣ 20 − 2 ∣ = 18 |4\times 5-1\times 2|=|20-2|=18 ∣4×5−1×2∣=∣20−2∣=18

三角形面积为

1 2 × 18 = 9 \frac{1}{2}\times 18=9 21×18=9


第8题

题目: 某程序需要判断点 P ( x , y ) P(x,y) P(x,y) 是否在以原点为圆心、半径为5的圆内或圆上。下列判断条件正确的是( )。

A. x ∗ x + y ∗ y < = 25 x*x+y*y<=25 x∗x+y∗y<=25

B. a b s ( x ) + a b s ( y ) < = 5 \mathrm{abs}(x)+\mathrm{abs}(y)<=5 abs(x)+abs(y)<=5

C. x ∗ x − y ∗ y < = 25 x*x-y*y<=25 x∗x−y∗y<=25

D. x + y < = 5 x+y<=5 x+y<=5

答案: A

解析:

点到原点距离为

x 2 + y 2 \sqrt{x^2+y^2} x2+y2

在圆内或圆上等价于

x 2 + y 2 ≤ 5 \sqrt{x^2+y^2}\le 5 x2+y2 ≤5

两边平方得

x 2 + y 2 ≤ 25 x^2+y^2\le 25 x2+y2≤25

即 x*x + y*y <= 25。


第9题

题目: 某无向带权图有边 ( 1 , 2 , 4 ) (1,2,4) (1,2,4)、 ( 1 , 3 , 2 ) (1,3,2) (1,3,2)、 ( 2 , 3 , 1 ) (2,3,1) (2,3,1)、 ( 2 , 4 , 5 ) (2,4,5) (2,4,5)、 ( 3 , 4 , 8 ) (3,4,8) (3,4,8)、 ( 3 , 5 , 10 ) (3,5,10) (3,5,10)、 ( 4 , 5 , 2 ) (4,5,2) (4,5,2)。该图最小生成树的总权值为( )。

A. 7

B. 8

C. 9

D. 10

答案: D

解析:

按边权从小到大排序:

( 2 , 3 , 1 ) , ( 1 , 3 , 2 ) , ( 4 , 5 , 2 ) , ( 1 , 2 , 4 ) , ( 2 , 4 , 5 ) , ( 3 , 4 , 8 ) , ( 3 , 5 , 10 ) (2,3,1),\ (1,3,2),\ (4,5,2),\ (1,2,4),\ (2,4,5),\ (3,4,8),\ (3,5,10) (2,3,1), (1,3,2), (4,5,2), (1,2,4), (2,4,5), (3,4,8), (3,5,10)

使用 Kruskal 算法:

  1. 选 ( 2 , 3 ) (2,3) (2,3),权值 1 1 1;
  2. 选 ( 1 , 3 ) (1,3) (1,3),权值 2 2 2;
  3. 选 ( 4 , 5 ) (4,5) (4,5),权值 2 2 2;
  4. ( 1 , 2 ) (1,2) (1,2) 会成环,不选;
  5. 选 ( 2 , 4 ) (2,4) (2,4),权值 5 5 5。

总权值:

1 + 2 + 2 + 5 = 10 1+2+2+5=10 1+2+2+5=10


第10题

题目: 有向非负权图边为 1 → 2 ( 3 ) 1\rightarrow2(3) 1→2(3)、 2 → 4 ( 4 ) 2\rightarrow4(4) 2→4(4)、 1 → 3 ( 10 ) 1\rightarrow3(10) 1→3(10)、 3 → 4 ( 1 ) 3\rightarrow4(1) 3→4(1)、 2 → 3 ( 2 ) 2\rightarrow3(2) 2→3(2)。使用 Dijkstra 算法从1号顶点出发到4号顶点的最短距离为( )。

A. 6

B. 7

C. 8

D. 11

答案: A

解析:

可能路径:

  • 1 → 2 → 4 1\rightarrow2\rightarrow4 1→2→4: 3 + 4 = 7 3+4=7 3+4=7
  • 1 → 3 → 4 1\rightarrow3\rightarrow4 1→3→4: 10 + 1 = 11 10+1=11 10+1=11
  • 1 → 2 → 3 → 4 1\rightarrow2\rightarrow3\rightarrow4 1→2→3→4: 3 + 2 + 1 = 6 3+2+1=6 3+2+1=6

最短距离为 6 6 6。


第11题

题目: 下列代码片段的时间复杂度为( )。

cpp 复制代码
long long s = 0;
for (int i = 1; i <= n; i++) {
    for (int j = 1; j * j <= n; j++) {
        s += i + j;
    }
}

A. O ( n ) O(n) O(n)

B. O ( n log ⁡ n ) O(n\log n) O(nlogn)

C. O ( n n ) O(n\sqrt{n}) O(nn )

D. O ( n 2 ) O(n^2) O(n2)

答案: C

解析:

外层循环执行 n n n 次。

内层条件为 j 2 ≤ n j^2\le n j2≤n,所以 j ≤ n j\le \sqrt{n} j≤n ,内层执行约 n \sqrt{n} n 次。

总时间复杂度为

O ( n n ) O(n\sqrt{n}) O(nn )


第12题

题目: 某优化问题的答案是 1 , M 1,M 1,M 内的整数,存在单调判定函数 check(x),且每次判定的时间复杂度为 O ( n ) O(n) O(n)。使用二分答案求最小可行值,整体时间复杂度通常为( )。

A. O ( n M ) O(nM) O(nM)

B. O ( n log ⁡ M ) O(n\log M) O(nlogM)

C. O ( M log ⁡ n ) O(M\log n) O(Mlogn)

D. O ( n + M ) O(n+M) O(n+M)

答案: B

解析:

二分答案需要进行 O ( log ⁡ M ) O(\log M) O(logM) 次判定。

每次判定复杂度为 O ( n ) O(n) O(n)。

总时间复杂度为

O ( n log ⁡ M ) O(n\log M) O(nlogM)


第13题

题目: 下列线性筛的代码片段中,当枚举到质数 p p p 且 i % p = = 0 i\%p==0 i%p==0 时,使用 break; 语句停止继续枚举。这样做的主要目的是( )。

cpp 复制代码
for (int i = 2; i <= n; ++i) {
    if (!is_composite[i])
        primes.push_back(i);
    for (int p : primes) {
        if (i * p > n)
            break;
        is_composite[i * p] = true;
        if (i % p == 0)
            break; // 这条语句的目的是?
    }
}

A. 保证递归深度不超过 O ( log ⁡ n ) O(\log n) O(logn)。

B. 保证每个合数只被它的最小质因子筛去一次。

C. 保证每个素数都被标记为合数。

D. 把筛法时间复杂度提高到 O ( n log ⁡ n ) O(n\log n) O(nlogn)。

答案: B

解析:

线性筛中,当 i % p = = 0 i\%p==0 i%p==0 时,说明 p p p 是 i i i 的最小质因子。此时若继续用更大的质数筛,会导致同一个合数被多个质因子重复筛去。

因此 break 的目的是保证每个合数只被它的最小质因子筛去一次,从而保证线性时间复杂度。


第14题

题目: 在 C++ 中,关于类的继承和构造、析构顺序,下列说法正确的是( )。

A. 派生类可以直接访问基类的 private 成员。

B. 基类的 protected 成员在私有继承后会变成派生类的 public 成员。

C. 创建派生类对象时,会先调用基类构造函数,再调用派生类构造函数。

D. 销毁派生类对象时,会先调用基类析构函数,再调用派生类析构函数。

答案: C

解析:

创建派生类对象时,构造顺序为:

  1. 先调用基类构造函数;
  2. 再调用派生类构造函数。

销毁时顺序相反:

  1. 先调用派生类析构函数;
  2. 再调用基类析构函数。

所以 C 正确。

A 错误,private 成员不能被派生类直接访问。

B 错误,私有继承后基类 protected 成员在派生类中变为 private。

D 错误,析构顺序反了。


第15题

题目: 将4个元素按 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 的顺序入栈,在该过程中可随时插入出栈操作。下列序列中不可能作为出栈序列的是( )。

A. 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4

B. 2 , 1 , 4 , 3 2,1,4,3 2,1,4,3

C. 3 , 2 , 1 , 4 3,2,1,4 3,2,1,4

D. 3 , 1 , 2 , 4 3,1,2,4 3,1,2,4

答案: D

解析:

A 可行:入1出1,入2出2,入3出3,入4出4。

B 可行:入1入2出2出1,入3入4出4出3。

C 可行:入1入2入3出3出2出1,入4出4。

D 不可行:若第一个出栈的是3,则栈内从底到顶为1、2,栈顶为3。出3后,栈顶为2,必须先出2,才能出1。因此不可能出现 3 , 1 , 2 , 4 3,1,2,4 3,1,2,4。


判断题

第1题

题目: 若一项任务可从两种互斥的方案中选择一种完成,其中方案A有 m m m 种做法,方案B有 n n n 种做法,则总做法数为 m + n m+n m+n。

答案: √

解析:

两种方案互斥,即选择方案A就不能选择方案B,选择方案B就不能选择方案A。根据加法原理,总做法数为

m + n m+n m+n


第2题

题目: 将 n n n 个不同元素围成一圈,若只把旋转视为同一种排法、翻转仍视为不同排法,则方案数为 ( n − 1 ) ! (n-1)! (n−1)!。

答案: √

解析:

这是圆排列问题。

若只把旋转视为同一种,则圆排列数为

n ! n = ( n − 1 ) ! \frac{n!}{n}=(n-1)! nn!=(n−1)!

翻转仍视为不同,因此不需要再除以2。正确。


第3题

题目: 从 n n n 个不同元素中可重复地选取 k k k 个且不考虑顺序,方案数为 C ( n + k , k ) C(n+k,k) C(n+k,k)。

答案: ×

解析:

从 n n n 个不同元素中可重复地选取 k k k 个且不考虑顺序,属于可重复组合,方案数应为

( n + k − 1 k ) \binom{n+k-1}{k} (kn+k−1)

题目中写成 ( n + k k ) \binom{n+k}{k} (kn+k),多加了1,因此错误。


第4题

题目: 杨辉三角中的组合数满足 C ( n , k ) = C ( n − 1 , k ) + C ( n − 2 , k ) C(n,k)=C(n-1,k)+C(n-2,k) C(n,k)=C(n−1,k)+C(n−2,k)。

答案: ×

解析:

杨辉三角中的组合数满足帕斯卡公式:

( n k ) = ( n − 1 k − 1 ) + ( n − 1 k ) \binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k} (kn)=(k−1n−1)+(kn−1)

题目中写成了

( n − 1 k ) + ( n − 2 k ) \binom{n-1}{k}+\binom{n-2}{k} (kn−1)+(kn−2)

因此错误。


第5题

题目: 快速幂通过二进制拆分指数,可以在 O ( log ⁡ b ) O(\log b) O(logb) 时间内计算 a b   m o d   m a^b\bmod m abmodm。

答案: √

解析:

快速幂每次将指数 b b b 右移一位,最多处理 O ( log ⁡ b ) O(\log b) O(logb) 位。

每轮进行一次乘法取模,因此时间复杂度为

O ( log ⁡ b ) O(\log b) O(logb)


第6题

题目: 只要图中不存在负权环,Dijkstra算法就一定能正确处理带负权边的图。

答案: ×

解析:

Dijkstra 算法要求所有边权非负。

如果存在负权边,即使没有负权环,也可能导致已经确定最短路的顶点之后被更短路径更新,从而得到错误结果。

因此该说法错误。


第7题

题目: 若一张连通无向图所有边权两两不同,则它的最小生成树一定唯一。

答案: √

解析:

若所有边权两两不同,则任意环上的最大边唯一。

根据最小生成树的性质,最大边一定不在最小生成树中,因此选择过程唯一,最小生成树唯一。


第8题

题目: 判断点 ( x , y ) (x,y) (x,y) 是否在以原点为圆心、半径为 r r r 的圆内或圆上时,可以比较 x 2 + y 2 x^2+y^2 x2+y2 与 r 2 r^2 r2,不必先开平方。

答案: √

解析:

点在圆内或圆上等价于

x 2 + y 2 ≤ r \sqrt{x^2+y^2}\le r x2+y2 ≤r

由于两边均非负,可以平方,得到

x 2 + y 2 ≤ r 2 x^2+y^2\le r^2 x2+y2≤r2

因此不需要开平方。


第9题

题目: 若能写出判定函数 check(x),表示"答案为 x x x 时是否可行",即使 check(x) 不满足单调性,也一定可以使用二分答案求最优解。

答案: ×

解析:

二分答案要求判定函数具有单调性。

例如若 x x x 可行,则所有大于 x x x 的值也可行,或所有小于 x x x 的值也可行。

如果 check(x) 不满足单调性,二分答案无法保证正确缩小范围,因此不能一定使用二分答案。


第10题

题目: 归并排序是一种稳定排序算法,常见实现的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)。

答案: √

解析:

归并排序在合并两个有序序列时,若相等元素优先取前一个序列中的元素,则可以保持稳定性。

其时间复杂度递推为

T ( n ) = 2 T ( n 2 ) + O ( n ) = O ( n log ⁡ n ) T(n)=2T\left(\frac{n}{2}\right)+O(n)=O(n\log n) T(n)=2T(2n)+O(n)=O(nlogn)

因此正确。

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

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

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

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

3、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 点击跳转

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

信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:

https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):

https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、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 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
longlongzihan1 小时前
LeetCode 283. 移动零:从辅助数组到双指针原地算法
c++·算法·leetcode
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】C++ ChatSDK使用手册
开发语言·网络·c++·人工智能·学习·大模型
程序喵大人10 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by2099911 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
余额瞒着我当琳14 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂14 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan15 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘15 小时前
C++继承
c++·继承
汉克老师16 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程