题解:P1226 【模板】快速幂
简练概述
给你很大的数
这是一道很好的模版题,解决方法有很多,用余数的性质甚至还可以达到常数级别,~虽然我忘了吧~。
快速幂算法详解
算法介绍
快速幂算法是一种用于高效计算大整数幂模运算的算法。其核心思想是通过将指数
快速幂的核心思想
- 幂的平方性质:对于任意整数
a 和b ,有a^b = (a^{b/2})^2 (当b 为偶数时)或a^b = a \times (a^{(b-1)/2})^2 (当b 为奇数时)。 - 二进制分解:将指数
b 表示为二进制形式,例如b = 2^{k_1} + 2^{k_2} + \dots + 2^{k_n} ,然后通过迭代计算a^{2^k} 来快速得到结果。
算法步骤
- 初始化结果为
1 。 - 将指数
b 转换为二进制形式。 - 遍历
b 的二进制位:- 如果当前位为
1 ,则将结果乘以a 的当前幂次。 - 将
a 平方,继续处理下一位。
- 如果当前位为
- 最终结果即为
a^b \bmod p 。
正确性证明
快速幂算法的正确性基于以下数学性质:
- 幂的平方性质:对于任意整数
a 和b ,有:a^b = \begin{cases} (a^{b/2})^2 & \text{如果 } b \text{ 是偶数}, \\ a \times (a^{(b-1)/2})^2 & \text{如果 } b \text{ 是奇数}. \end{cases} - 模运算的分配律:对于任意整数
a, b, p ,有:(a \times b) \bmod p = [(a \bmod p) \times (b \bmod p)] \bmod p.
通过将指数
代码实现
以下是快速幂算法的 C++ 实现代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a, b, p, s;
// 快速幂函数
int ksm(int a, int b, int p) {
int sum = 1; // 初始化结果为 1
a = a % p; // 先对 a 取模,防止溢出
while (b > 0) {
// 如果当前二进制位为 1,将结果乘以 a
if (b & 1) {
sum = (sum * a) % p;
}
// 将 a 平方,继续处理下一位
a = (a * a) % p;
b = b >> 1; // 右移一位,相当于 b /= 2
}
return sum;
}
signed main() {
cin >> a >> b >> p;
s = ksm(a, b, p);
cout << a << "^" << b << " mod " << p << "=" << s;
return 0;
}