快速幂
快速幂是种快速计算a^b的算法,其中用到了二分的思想
方法是把b分成 2的平方,2的立方……之和
例如100^3,3=2^0+2^1,即3用二进制来表示为11
那么上面的答案就是100*(100^2)
快速幂就是这么的简单,但是代码实现需要比较清晰的思路,如下是的题目是求a^b %c
传送门https://www.luogu.org/problem/show?pid=1226#sub
#include<bits/stdc++.h>
using namespace std;
long long b,p,k,base = 0,ans = 1;
int main(){
cin>>b>>p>>k;
printf("%lld^%lld mod %lld=",b,p,k);
base = b;
while(p){
if(p & 1) ans = ans * base;
ans %= k;
base = base * base % k;
p = p / 2;
}
cout<<ans;
return 0;
}
我们知道,在许多时候,即使是long long也会炸掉,所以在计算base的时候直接%k,在这里本蒟蒻一开始犯了一个低端的错误:在while循环中的第3行更新base的值时写成了base *= base % k;
我们可以发现,这里*=的优先级和本蒟蒻认为的不一样,导致了wa了4个点……
这次的快速幂就说到这里了,希望大家可以马上明白,而不是像某蒟蒻一样