1 条题解
-
0
文字教学
本题要求计算 ,但 都可能非常大(最大 ),直接计算 后再取模完全不可行,必须使用快速幂(也称二分幂)。
快速幂的基本思想:利用指数的二进制表示,将幂次折半。例如计算 :
- 若 ,结果为 。
- 否则维护一个底数
base = a % p和结果res = 1。 - 循环,每次判断 的最低位:
- 若为 ,则
res = (res * base) % p; - 然后将
base平方后取模:base = (base * base) % p; - 将 右移一位。
- 若为 ,则
- 当 变为 时结束,
res即为答案。
这种方法每次将指数规模减半,时间复杂度为 ,可以轻松应对 在
int范围的情况。运算过程中乘法可能会超出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
- 上传者
京公网安备 11011102002149号