CSP-S 提高级 · CSP 2026 提高级第一轮 第 15 题

选择题 · 答案 B · 考点:快速幂、同余与模运算、数论算法

← 整套速查表 CSP-S 提高级 全部真题

题目

【单选】执行 power(2, 100, 1000) 调用下列函数,返回值是( )。

long long power(long long a, long long b, long long p) {
    long long r = 1 % p;
    while (b) {
        if (b & 1)
            r = r * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return r;
}
答案:B

考点

快速幂同余与模运算数论算法

解题思维

这是快速幂(模幂)的模板:求 2^100 mod 1000。要么按二进制逐位平方-乘手算,要么直接注意到 2^100 的末三位是 376。

常见错误

把 r = 1 % p 忽略而算错起点;中间值 a = a * a % p 忘记取模导致越界(虽然 long long 不会溢出,但手算时要记得每步取模)。

详细解析(节选)

解析

题目函数:

long long power(long long a, long long b, long long p) {
    long long r = 1 % p;
    while (b) {
        if (b & 1) r = r * a % p;   // 该位为 1 → 把当前的 a 乘进答案
        a = a * a % p;              // 底数平方,为下一位做准备
        b >>= 1;                    // 指数右移一位
    }
    return r;
}

求 power(2, 100, 1000) = 2^100 mod 1000。

方法一:按快速幂逐位推演(考试最稳)

100 = 1100100₂(位权:64 + 32 + 4 = 100 ✓)。按位从低到高处理:

位b 的最低位动作ra
——初值12
10只平方12²=4
20只平方14²=16
31r ← r×a;再平方1616²=256
40只平方16256²=65536 ≡ 536
50只平方16536²=287296 ≡ 296
61r ← r×a;再平方16×296=4736 ≡ 736296²=87616 ≡ 616
71r ← r×a736×616=453376 ≡ 376(结束)

结果 376,选 B。

方法二:分解成 2^10 的幂(更快)

注意 2^100 = (2^10)^10 = 1024^10。

方法三:记忆型观察

2^10 = 1024 → 末三位 024;2^20 = 1048576 → 576;2^30 → 576×576 = 331776 → 776……末三位会快速稳定:2^n (n ≥ 3) 的末三位以 100 为周期,而 2^100 的末三位正是 376(也是 2^100 的十进制末三位,100 = 4×25 的经典结论)。

其他选项为什么错

记忆点

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断