我在网上看到一段加速取模的代码
struct FastMod{
typedef unsigned long long ULL;
typedef __uint128_t LLL;
ULL b,m;
void init(ULL b){this->b=b,m=ULL((LLL(1)<<64)/b);}
ULL operator()(ULL a)const{
ULL q=(ULL)((LLL(m)*a)>>64);
ULL r=a-q*b;
return r>=b?r-b:r;
}
}mod;
这里是来源
请问,以上快速取模代码是如何保证 0≤r<2∗b 的呢?
百思不得其解。