快速幂取模许多时候我们需要计算a^b %c 如是的式子。 一、像下面这样直接来求 int res = 1;
for(int i = 1;i<=b;i++)
{
res = res * a;
}
res = res % c;如果b很大,很容易超时;如果a,b很大,在计算过程中可能会超过long long所能表示的范围,因此想办法优化。
二、对于取模运算有这样一个性质:a^b mod c =(a mod c)^b mod c
于是改进一下: int res = 1;
a = a % c; //加上这一句
for(int i = 1;i<=b;i++)
{
res = (res * a) % c;//这里再取了一次余
}
res = res % c;这样能避免超数范围的问题,但时间复杂度依旧是O(b),当b很大依旧会爆时间。
代码示例#include
using namespace std;
int FastExp(int a,int b,int c)
{
int res=1;
a=a%c;
while(b>0)
{
if(b&1) //二进制b为奇数时,最后一位是1
res=(a*res)%c;
b=b>>1; //二进制右移1位,相当于对下取整除2
a=(a*a)%c;
}
return res;
}
long long BignumMod(char *s,int mod)
{
long long ans=0;
for(int i=0;s[i]!='