快速幂就是二分乘,如果在fun(a,b,k)中 b是奇数,就最后再乘以a
比如 fun(a,b)中,b是偶数,那就乘b/2次,a = a*a;
b是奇数,那就b/2+1次 ,a=a*a,if(b&1) a=a*a;
反复乘的过程中一定有一次b=1,这样ans的值传出来,太妙了。
int mi(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)
ans = ans*a;
a=a*a;
b/=2;
}
return ans;
}
快速幂取模原理是:(a`b)mod k = (a mod k)`b mod k
结合上面的快速幂,就很容易理解了,加一个mod就行
int mod(int a,int b,int k){
int ans=1,a=a%k;
while(b)
{
if(b&1)
{
ans = (ans*a)%k;
}
a =(a*a)%k;
b/=2;
}
return ans;
}