Barrett Reduction 快速取模简记
struct fmod{
ll m,p;
void init(ll mod){m=((i128)1<<64)/mod,p=mod;}
ll operator()(ll x){return x-(((i128)x*m)>>64)*p;}
}MOD;
模数可以传 long long 范围内的正数,但是注意到 \(m\) 开的是 long long 所以上述实现在 \(mod\le 2\) 的时候会爆掉需要注意。
取模可以直接传入 long long 范围内的任意数,正负数都行,传正数返回值在 \([0,2p)\) 内,传负数返回值在 \((-p,p)\) 内,虽然不保证在 \([0,p)\) 内但是仍可以接受。

浙公网安备 33010602011771号