今天(2023/8/31)靠 Barrett 算法
这个算法的目的是,在固定模数 %
更快。
这个算法的精髓是估算。首先问题可以转化成
为什么是
现在用这个近似值估算:
假设这个
最后算答案:
特判一下就好了,多做一个减法而已。
当然我们找不到那么大的
#define ull unsigned long long
#define ui128 __uint128_t
struct Barrett {
ull d;
ui128 m;
Barrett(ull _d):d(_d),m((((ui128)(1)<<64)/d)) {}
ull operator ()(ull a) {
ull w=(m*a)>>64;
w=a-w*d;
if(w>=d) w-=d;
return w;
}
};