二分快速冪
阿新 • • 發佈:2018-11-24
pre 代碼 數學 誤差 long long math.h 大會 math 二分
二分快速冪
求a的b次方,自定義pow庫函數:
pow(a, b)是數學頭文件math.h裏面有的函數,但是它返回值是double類型,數據有精度誤差。
可以改成這樣:
long long pow(long long a, long long b){
long long ret = 1;
for(long long i = 1; i <= b; i ++){
ret *= a;
}
return ret;
}
二分快速冪:
數據量大會超時,使用自定義的pow也要超市,這時候要使用二分快速冪了
代碼模板:
const int MOD=1e9+7; typedef long long ll; LL pow_mod(LL a, LL b){//a的b次方 if(b == 0) return 1%MOD; LL ret = pow_mod(a, b/2); ret = ret * ret % MOD; if(b % 2 == 1) ret = ret * a % MOD; return ret; }
快速乘:
LL mul(LL a, LL b, LL p){//快速乘,計算a*b%p
LL ret = 0;
while(b){
if(b & 1) ret = (ret + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ret;
}
二分快速冪