写法一
public static long qmi(long b, long i,int mod) {
long ans=1;
for(;i>0;i>>=1,b=b*b%mod)if((i&1)==1)ans = ans * b % mod;
return ans;
}
写法二
static long qmi(long a,long b){
long ans=1;
while(b!=0) {
if ((b & 1) == 1) {
ans = ans*a%mod;
}
a = a*a%mod;
b >>=1;
}
return ans;
}
注意每次b*=b,ans*=b。快速幂中没有加法出现!
保险起见,所有数据类型全设置为Long.
ans初始值为1而不是0.
必须写成b>>=1,不要写成b/=2。后者太慢了,会T。
(注意如果要对底数取模,底数是否可能是负数。如果可能是的话,取模函数写作如下形式:
static int ff(int x,int m) {
return (x%m+m)%m;
}