快速乘(模板)

因为有时候乘法会溢出,即使是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;
}

 

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