专栏文章
题解:P1226 【模板】快速幂
P1226题解参与者 5已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @miq1mxi8
- 此快照首次捕获于
- 2025/12/03 21:29 3 个月前
- 此快照最后确认于
- 2025/12/03 21:29 3 个月前
快速幂 算法介绍
为什么要使用快速幂
如果按照正常方式求幂,则时间复杂度为 ,速度在某些题是不够的(例如本题就只能拿到 分)。
所以前人们想到了一种方法,能够在 的时间内计算出结果。
快速幂举例
注:本章节仅举例,为什么要这么操作请见下文“算法正确性证明”。
首先约定一个初始值为 的 为答案。
例如,我们要计算 ,我们先把 拆成二进制的 。
的最后一位是 ,把 赋值为 , 赋值为 ,随后右移 ,使其变为 。
的最后一位是 ,把 赋值为 , 赋值为 ,随后右移 ,使其变为 。
的最后一位是 ,把 赋值为 ,随后右移 ,使其变为 。
的最后一位是 ,把 赋值为 , 赋值为 ,随后右移 ,使其变为 。
运行下去没有任何意义了,结束。
此时我们就得到了正确的结果。
正确性证明
算法正确性证明
快速幂使用二进制来加快计算。
例如,我们要计算 ,因为 的二进制是 ,我们可以转换出以下内容:
不需要有惊人的注意力就能发现,它的结果只和二进制中的非零项有关,所以在计算时我们只需要计算当前二进制位为 的位。
我们还可以通过指数的运算性质知道:
高次幂可以通过低次幂求出,那么答案一定也可以从低次幂求出。
同时,由模运算的性质可以知道,在快速幂的运算过程中取模不会影响答案的正确性。
时间复杂度证明
对于任何一个数 ,它有 个二进制位,所以时间复杂度为 。
代码实现
CPP#include<bits/stdc++.h>
using namespace std;
long long a,b,p,ans=1;
long long poww(long long a,long long b,long long p){
while(b>0){//如果b还不是0
if(b&1) ans=ans*a%p;//如果最低位是1 就把ans*a
a=a*a%p;//不论最低位是不是1,a都需要自乘以升幂
b>>=1;//b右移一位
}
return ans;
}
int main(){
scanf("%d%d%d",&a,&b,&p);
printf("%d^%d mod %d=%d",a,b,p,poww(a,b,p));
return 0;
}
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...