龟速乘 & int128 输出流自定义
作者:
jzz2.0
,
2024-04-07 17:47:57
,
所有人可见
,
阅读 51
由于a*b会爆long long,则该题可以直接强制转化为__int128解决
加强一下数据,若 -10^36 <= a, b, p <= 10^36,a*b会爆__int128,则应该使用龟速乘解决
std::ostream &operator<<(std::ostream &os, __int128 n) {
std::string s;
while (n) {
s += '0' + n % 10;
n /= 10;
}
std::reverse(s.begin(), s.end());
return os << s;
}
__int128 mul(__int128 a, __int128 b, __int128 M) {
a = (a % M + M) % M;
b = (b % M + M) % M;
__int128 ans = 0;
while (b) {
if (b & 1) {
ans += a;
if (ans >= M) {
ans -= M;
}
}
a <<= 1;
if (a >= M) {
a -= M;
}
b >>= 1;
}
return ans;
}