很多时候,当我们在做题时会遇到指数级的运算,那么一旦指数大了,运算结果就会非常大,导致电脑存储不下,一旦达到2^31这种时候就自然溢出了。那么取模就很重要了。这里的快速幂取模算法可以大幅优化时间和空间的复杂度。
首先了解快速幂取模算法的原理:积的取余等于取余的积的取余,意思就是(a*b)%c=((a%c)*(b%c))%c,在此基础上,对指数型的数据进行拆解合并,就是快速幂取模算法。
那么我们考虑为什么最后a^b会爆掉?就是因为a,b的规模太大,那么就考虑如何缩小规模:
void qumo(int a,int b,int c) //a为底数,b为指数,c为模数
{
int sum=1;
a=a%c;
for(int i=1;i<=b;++i)
sum=(sum*a)%c;
return sum;
}
显而易见的是,这里只是缩小了a的规模,如果b达到1e10以上的数据那么还是gg,接下来就考虑缩小b的规模:
对于一个数a^b,很明显它可以化为(a^2)^(b/2),而a的规模又可以通过上面所讲的方式缩小,这样就非常舒服了。如果b为奇数,那么就先将这个数预先处理出来取模即可。
下面就是代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL quickmod(LL a,LL b,LL c)//a为底数,b为阶数,c为模数
{
LL a2=a%c;
LL ans=1;
while(b)
{
if(b%2) //这里可以用位运算来写,就是b&1;
ans=(ans*a2)%c;
a2=(a2*a2)%c;
b=b>>1;
}
return ans;
}
int main()
{
LL a,b,c;
cin>>a>>b>>c;
LL result=quickmod(a,b,c);
printf("%lld\n",result);
return 0;
}