就是在求a^b%m时,当A和B很大时用到的一种方法,基于二分的思想,可以达到O(logn)
可以把b按二进制展开为:b = p(n)*2^n + p(n-1)*2^(n-1) +…+ p(1)*2 + p(0)
其中p(i) (0<=i<=n)为 0 或 1这样 a^b = a^ (p(n)*2^n + p(n-1)*2^(n-1) +...+ p(1)*2 + p(0))
= a^(p(n)*2^n) * a^(p(n-1)*2^(n-1)) *...* a^(p(1)*2) * a^p(0)
对于p(i)=0的情况, a^(p(i) * 2^(i-1) ) = a^0 = 1,不用处理
//计算a^bmodn
int modexp(int a,int b,int n)
{
int ret=1;
while(b)
{
if(b&1) ret=ret*a%n;
a=(a*a)%n;
b>>=1;
}
return ret;
}