(a+b)%mod=(a%mod+b%mod)%mod
(a-b)%mod=(a%mod-b%mod)%mod
(a*b)%mod=(a%mod*(b%mod))%mod
a/b%mod≠(a%mod)/(b%mod)%mod
求a^bmodc
int ans = 1;
a = a % k;
if(b % k == 1)
ans = a % k;
int s;
s = (a * a) %k;
for(int i = 1; i <= b/2; i ++)
{
ans = (ans*s)%k;
}
ans = ans % k;
printf("%d\n", ans);
如果这样计算只是把时间复杂度从O(b)变为O(b/2),并没有太大改变。
我们发现这个过程是可以迭代下去的。当然,对于奇数的情形会多出一项a mod c,所以为了完成迭代,当b是奇数时,我们通过
ans = (ans * a) % c;来弥补多出来的这一项,此时剩余的部分就可以进行迭代了。
形如上式的迭代下去后,当b=0时,所有的因子都已经相乘,算法结束。于是便可以在O(log b)的时间内完成了。于是,有了最终的算法:快速幂算法。
int PowerMod(int a, int b, int c)
{
int ans = 1;
a = a % c;
while(b>0)
{
if(b % 2 = = 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
return ans;
}