共48道题,当前是第46

初赛真题

01 #include <iostream>
02 using namespace std;
03 
04 int fastpow(int a, int b, int p) {
05     int ans = 1;
06     a = a % p;
07     for (int i = 0; i <= 31; i++) {
08         if (b & (1 << i)) ans = ans * a % p;
09         a = a * a % p;
10     }
11     return ans;
12 }
13 int main() {
14     int a, b, p;
15     cin >> a >> b >> p;
16     cout << fastpow(a, b, p);
17     return 0;
18 }

假设输入的 a 和 b 和 p 都是 int 范围内的正整数,完成下面的判断题和单选题:

1. B。
2. B。
3. B。
4. B。
5. D。
6. D。

这段代码是快速计算 $a^b \% p$ 的代码,也就是快速幂。通过直接枚举 $b$ 的二进制位来进行计算。关于模数对输出值的影响:我们可以对一个期望输出 $c$ 来构造模数 $p$ 使得 $ans - p = c$ 且 $ans - p < p$ 。这两个条件均满足时,可以构造出输出 $c$

Question

1. 有必要将第 9 行 a*a 两侧添加括号。( )

2. 交换第 8 行与第 9 行,输出不会改变。( )

3. 缩小 b 的范围一定不会改变输出。(指在 a,p 任意给出时答案仍然正确,下同,且最多缩小至 10 )

4. 缩小 p 的范围一定不会改变输出。( )

5. 若输入的 a 为 4 ,b 为 7 ,则输出不可能为 ( )

6. 以下说法正确的是 ( )。