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)\) 内但是仍可以接受。

posted @ 2026-10-08 10:21  LastKismet  阅读(9)  评论(0)    收藏  举报