龟速乘 防止爆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;
}