1. 程式人生 > >二分快速冪

二分快速冪

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;
}

二分快速冪