1 条题解

  • 0
    @ 2026-5-6 10:18:09

    文字教学

    本题要求计算 abmodpa^b \bmod p,但 a,ba, b 都可能非常大(最大 23112^{31}-1),直接计算 aba^b 后再取模完全不可行,必须使用快速幂(也称二分幂)。

    快速幂的基本思想:利用指数的二进制表示,将幂次折半。例如计算 abmodpa^b \bmod p

    • b=0b = 0,结果为 1modp1 \bmod p
    • 否则维护一个底数 base = a % p 和结果 res = 1
    • 循环,每次判断 bb 的最低位:
      • 若为 11,则 res = (res * base) % p
      • 然后将 base 平方后取模:base = (base * base) % p
      • bb 右移一位。
    • bb 变为 00 时结束,res 即为答案。

    这种方法每次将指数规模减半,时间复杂度为 O(logb)O(\log b),可以轻松应对 bbint 范围的情况。运算过程中乘法可能会超出 int 范围,需要用 long long 过渡。


    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int main() {
        int a, b, p;
        cin >> a >> b >> p;
        ll base = a % p, res = 1 % p;
        int e = b;
        while (e) {
            if (e & 1) res = (res * base) % p;
            base = (base * base) % p;
            e >>= 1;
        }
        cout << a << "^" << b << " mod " << p << "=" << res << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    226
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    23
    已通过
    11
    上传者