专栏文章
题解:P1226 【模板】快速幂
P1226题解参与者 5已保存评论 6
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @miq1dgdf
- 此快照首次捕获于
- 2025/12/03 21:22 3 个月前
- 此快照最后确认于
- 2025/12/03 21:22 3 个月前
简练概述
给你很大的数 ,让你计算 。
这是一道很好的模版题,解决方法有很多,用余数的性质甚至还可以达到常数级别,~虽然我忘了吧~。
快速幂算法详解
算法介绍
快速幂算法是一种用于高效计算大整数幂模运算的算法。其核心思想是通过将指数 分解为二进制形式,利用幂的平方性质将计算复杂度从 降低到 。
快速幂的核心思想
- 幂的平方性质:对于任意整数 和 ,有 (当 为偶数时)或 (当 为奇数时)。
- 二进制分解:将指数 表示为二进制形式,例如 ,然后通过迭代计算 来快速得到结果。
算法步骤
- 初始化结果为 。
- 将指数 转换为二进制形式。
- 遍历 的二进制位:
- 如果当前位为 ,则将结果乘以 的当前幂次。
- 将 平方,继续处理下一位。
- 最终结果即为 。
正确性证明
快速幂算法的正确性基于以下数学性质:
- 幂的平方性质:对于任意整数 和 ,有:
- 模运算的分配律:对于任意整数 ,有:
通过将指数 分解为二进制形式,快速幂算法能够将计算 的复杂度从 降低到 ,同时保证结果的正确性。
代码实现
以下是快速幂算法的 C++ 实现代码:
CPP#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;
}
相关推荐
评论
共 6 条评论,欢迎与作者交流。
正在加载评论...