快速幂
大家好,我是Weekoder!
今天的内容是快速幂!(实际上是为了讲矩阵快速幂赶出来的嘻嘻
快速幂,顾名思义就是快速地计算出某个数的幂,形如
为什么普通的幂运算慢?假设要计算
注意:
可以发现,这样只计算了
那如果
于是,我们可以把
我们在刚刚提到过,计算
这个问题的关键在于,怎样将一个数拆分成
可以看到,
而因为一个数
就决定是你了!快速幂模板!
先上代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll expow(ll a, ll n, ll p) {
ll r = 1;
while (n) {
if (n & 1) r = r * a % p;
a = a * a % p, n >>= 1;
}
return r;
}
int main() {
ll a, b, p;
cin >> a >> b >> p;
cout << a << "^" << b << " mod " << p << "=" << expow(a, b, p);
return 0;
}
输入和输出就不用我讲了,重点是
typedef long long ll;
ll expow(ll a, ll n) {
ll r = 1;
while (n) {
if (n & 1) r *= a;
a *= a, n >>= 1;
}
return r;
}
比如计算
首先,我们用一个
这样就可以用
小扩展:幂取模
即计算
只需要在快速幂的模板里稍微改动一下。在做乘法运算时,顺带取模就行了。
幂取模模板代码如下:
typedef long long ll;
ll expow(ll a, ll n, ll p) {
ll r = 1;
while (n) {
if (n & 1) r = r * a % p;
a = a * a % p, n >>= 1;
}
return r;
}
综上所述,二进制快速幂的核心就是这些了。当然,快速幂除了计算
再见!
本文作者:Weekoder
本文链接:https://www.cnblogs.com/Weekoder/p/18237773
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步