1 结论(a*b)mod c=((a mod c)*(b mod c))mod c
a^b%c=((a%c)^b)%c
2 先这样理解一下
int ans=1;
a=a%c;
if(b%2==1) ans=ans*a%c;
k=a*a%c;
for(i=0;i<b/2;i++)
{ans=ans*k%c;}
return ans%c
我们把式子转化成k^(b/2)modc
所以快速幂就是不断把k变成下一个k,如果遇到奇数,多一项,先算下
2 快速幂的转置算法: a^b%c
int ans=1;
int a=a%c;
while(b>0)
{
if(b%2==1) ans=(ans*a)%c;
b=b/2;
a=a*a%c;
}
return ans
就是这么一个过程,每次先把a%c,之后把b减半,进行a^2%c,得到了新的a;重复上述过程,直到b=0. 几个乘数求余就相当于把每个数求余(用ans保存),再把ans做累积,最后除以余数.
而如果b等于0,最开始会多出一项,所以余数先算一次