从本不同的算法书和本不同的数学书中选出本,要求两类书都至少选本,共有( )种不同选法。
B:455。按两类书的数量分类:3 算法 1 数学 C(7,3)×C(5,1)=175,2+2 为 C(7,2)×C(5,2)=210,1 算法 3 数学 C(7,1)×C(5,3)=70,共 455。
个人排成一排照相,其中甲、乙两人不能相邻,共有( )种不同排法。
B:480。总数 6!=720 减去甲乙相邻的情况:捆绑甲乙(内部 2 种)与其余 4 人共 5 个元素排列 5!,得 2×120=240;720−240=480。
展开式 中,常数项的系数为( )。
C:15。通项 C(6,k)(x²)^(6−k)(−1/x)^k 中 x 的指数为 12−3k,令其为 0 得 k=4,常数项系数 C(6,4)·(−1)⁴=15。
下面代码用于预处理组合数,横线处应填入的是( )。
01for (int i = 0; i <= n; i++) { 02 c[i][0] = c[i][i] = 1; 03 for (int j = 1; j < i; j++) 04 c[i][j] = ______; 05}
A:c[i-1][j-1]+c[i-1][j]。杨辉三角递推 C(i,j)=C(i-1,j-1)+C(i-1,j),边界 c[i][0]=c[i][i]=1;B、C、D 的索引组合不符合该递推。
下列程序输出的值为( )。
01#include <iostream> 02using namespace std; 03long long qpow(long long a, long long b, long long mod) { 04 long long ans = 1 % mod; 05 while (b) { 06 if (b & 1) 07 ans = ans * a % mod; 08 a = a * a % mod; 09 b >>= 1; 10 } 11 return ans; 12} 13int main() { 14 cout << qpow(3, 20, 17) << endl; 15 return 0; 16}
C:13。3²⁰ mod 17:费马小定理 3¹⁶≡1(mod 17),3²⁰=3¹⁶·3⁴≡81≡13(mod 17)。
归并排序每次把长度为 的序列分成两个规模约为 的子序列,递归排序后再用线性时间合并。该算法的时间复杂度通常为( )。
D:O(n log n)。每次对半划分产生约 log n 层递归,每层合并总耗时 O(n),总 O(n log n),与输入顺序无关,最坏也是这个阶。
在平面直角坐标系中,三角形三个顶点为 、、,该三角形面积为( )。
A:9。向量 AB=(4,1)、AC=(2,5),叉积 |4×5−1×2|=18,面积=叉积绝对值的一半=18/2=9;用海伦公式也可验证。
某程序需要判断点 是否在以原点为圆心、半径为 的圆内或圆上。下列判断条件正确的是( )。
A:x²+y²≤25。点到原点距离 √(x²+y²)≤5,平方即 x²+y²≤25;B 描述的是菱形区域,C、D 均不是圆。
某无向带权图有边 、、、、、、。该图最小生成树的总权值为( )。
D:10。Kruskal 升序取边:(2,3)=1、(1,3)=2、(4,5)=2、(1,2)=4 成环跳过、(2,4)=5 取入,MST 总权 1+2+2+5=10。
有向非负权图边为 、、、、。使用 Dijkstra 算法从 号顶点出发到 号顶点的最短距离为( )。
A:6。路径 1→2(权 3)、2→3(权 2)、3→4(权 1)总长 3+2+1=6;1→2→4=7,1→3→4=11,均更长。
下列代码片段的时间复杂度为( )。
01long long s = 0; 02for (int i = 1; i <= n; i++) { 03 for (int j = 1; j * j <= n; j++) { 04 s += i + j; 05 } 06}
C:O(n√n)。内层循环次数恒为 √n(条件只依赖 n 与 i 无关),外层循环 n 次,总操作数 n×√n=O(n√n),不是 O(n log n)。
某优化问题的答案是 内的整数,存在单调判定函数 check(x),且每次判定的时间复杂度为 。
使用二分答案求最小可行值,整体时间复杂度通常为( )。
B:O(n log M)。答案区间 [1,M] 二分约 log₂M 轮,每轮调用一次 O(n) 的 check,总复杂度 O(n log M)。
下列线性筛的代码片段中,当枚举到质数 且 i % p == 0 时,使用 break 停止继续枚举。这样做的目的是( )。
01for (int i = 2; i <= n; ++i) { 02 if (!is_composite[i]) 03 primes.push_back(i); 04 for (int p : primes) { 05 if (i * p > n) 06 break; 07 is_composite[i * p] = true; 08 if (i % p == 0) 09 break; 10 } 11}
B:i%p==0 时 p 已是 i 的最小质因子,继续乘更大的质数得到的合数会由更小的质因子在别处筛掉,break 避免重复标记,保证每个合数只被其最小质因子筛一次。
在 C++ 中,关于类的继承和构造、析构顺序,下列说法正确的是( )。
C:创建派生类对象先调基类构造函数再调派生类构造函数;A 中基类 private 成员派生类不可直接访问,B 私有继承下 protected 变为 private,D 析构顺序应相反。
将个元素按 1,2,3,4的顺序入栈,在该过程中可随时插入出栈操作。下列序列中不可能作为出栈序列的是( )。
D:3 出栈时 1、2 必已入栈且 2 在 1 上方,3 出栈后栈顶是 2,下一出栈只能是 2 或先入 4 再出 4,不可能先出 1;其余三项均可实现。
若一项任务可从两种互斥的方案中选择一种完成,其中,方案A有 种做法,方案B有 种做法,则总做法数为 。
A:正确。两种方案互斥、不能同时发生,任选其一即可完成任务,总做法数相加 m+n,即分类加法计数原理,与分步乘法原理相对。
将 个不同元素围成一圈,若只把旋转视为同一种排法,翻转仍视为不同排法,则方案数为 。
A:正确。环形排列固定一个元素以消除旋转对称,余下 n−1 个元素作线性排列 (n−1)!;翻转视为不同排列所以不除以 2,与手性对称问题不同。
从 个不同元素中可重复地选取 个且不考虑顺序,方案数为 。
B:错误。可重复组合(允许重复选取、不考虑顺序)的方案数是 C(n+k−1,k),用隔板法得到;C(n+k,k) 多算了一种。
杨辉三角中的组合数满足 。
B:错误。正确恒等式是 C(n,k)=C(n−1,k−1)+C(n−1,k)(杨辉三角上方两数之和);C(n−1,k)+C(n−2,k) 不是组合数递推。
快速幂通过二进制拆分指数,可以在 时间内计算 。
A:正确。快速幂把指数 b 按二进制拆位,每位做一次平方累乘,循环约 log₂b 次,故 O(log b),远快于连乘 b 次。
只要图中不存在负权环,Dijkstra 算法就一定能正确处理带负权边的图。
B:错误。Dijkstra 的贪心正确性依赖边权非负;存在负权边时,已确定的最短路可能被后来的负边更新而失效,须改用 Bellman-Ford/SPFA。
若一张连通无向图所有边权两两不同,则它的最小生成树一定唯一。
A:正确。Kruskal 按权值升序选边,边权两两不同时不存在同权竞争,每条边的取舍完全确定,最小生成树唯一;反之不成立。
判断点 是否在以原点为圆心、半径为 的圆内或圆上时,可以比较 与 ,不必先开平方。
A:正确。比较 x²+y² 与 r² 等价于比较距离与 r,省去开方更快且避免浮点误差,是判断点在圆内或圆上的常用做法。
若能写出判定函数 check(x),表示“答案为 时是否可行”,即使 check(x) 不满足单调性,也一定可以使用二分答案求最优解。
B:错误。二分答案要求 check(x) 关于 x 单调(可行与不可行分界唯一);不单调时二分可能跳过最优解,无法保证求出最优。
归并排序是一种稳定排序算法,常见实现的时间复杂度为 。
A:正确。归并排序合并时相等元素先取左段,是稳定排序;无论输入如何时间复杂度均为 O(n log n),代价是 O(n) 辅助空间。