加载中...

龟速乘 防止爆longlong

因为乘是o1 但我们变成olog

//龟速乘 将乘法变成加法 a*b%k
LL qmul(LL a, LL b, LL c) {
    LL res = 0;// 加法的0元为0
    while (b) {
        if (b & 1) res = (res + a) % c;
        a = (a + a) % c;
        b >>= 1;
    }
    return res;
}
//快速幂
LL qmi(LL a, LL b, LL c) {
    LL res = 1;
    while (b) {
        if (b & 1) res = qmul(res, a, c);
        a = qmul(a, a, c);
        b >>= 1;
    }
    return res;
}

不使用龟速乘 int_128 o1

//
LL qmi(LL a, LL k, LL c) {
    LL res = 1;
    while (k) {
        if (k & 1) res = (_int128)res*a%b;
        a = (_int128)a*a%b;
        k >>= 1;
    }
    return res;
}

posted @ 2022-08-08 23:10  liang302  阅读(18)  评论(0编辑  收藏  举报