快速乘(模板)

因爲有時候乘法會溢出,即使是long long也可能在乘法時爆掉。而使用快速乘會很高效完成乘法操作並且不會爆long long

快速乘就是將它轉化爲加法,不是一個一個的加,仿照2進制加法操作來完成(快速乘需要它爲正數,不能爲負數

O(1)的快速乘

typedef long double ld;
typedef long long LL;
typedef unsigned long long ull;
LL ksc(LL x, LL y, LL p){
    LL z = (ld)x / p * y;
    LL res = (ull)x *y - (ull)z * p;
    return (res + p) % p;
}

O(log)的快速乘

typedef long long LL;
LL ksc(LL x, LL y, LL p){
    LL res = 0;
    while(y){
        if(y & 1) res = (res + x) % p;
        x = (x << 1) % p;   //將x不斷乘2達到二進制
        y >>= 1;
    }
    return res;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章