Barrett 取模优化,通常在模数为输入的情况下使用。
Tips:适用于 int 范围内的模数,已经特判了 P=1 的情况,不用做其它任何处理。
1 2 3 4 5 6 7 8
| struct Mod { using ULL = unsigned long long; ULL m, p; void init(ULL _p) {p = _p; m = (__int128(1) << 64) / p;} ULL operator()(ULL x) { return p == 1 ? 0 : x - (__int128(x) * m >> 64) * p; } } mod;
|