一些小技巧(持续更新。。)
二进制集合枚举子集
枚举一个二进制集合的子集,可以看做原集合忽略0之后不断-1
就有了这样一种算法:
for (int i = s; i; i = (i - 1) & s)
i - 1使得末尾的0全部变成1,但是由于&s,原来是0的位无论如何也不会变成1,但是原来是1的位就形成了不断-1的模式
卡空间##
struct Node {
ull mx : 18, ls : 23, rs : 23;
}
mx占18位,ls和rs占23位
斐波拉契数列
\(f[i] = f[i - 1] + f[i - 2]\)
\(sum[i] = sum[i - 1] + f[i]\)
\(sum[i] = f[i + 2] - 1\)
推式子
\(1^3 + 2^3 + 3^3 + ... + n^3 = (1+2+3+...+n)^2\)
防爆乘
inline LL mul(LL x, LL y, LL Mod) {
LL tmp=(x*y-(LL)((long double)x/Mod*y+0.5)*Mod);
return tmp < 0 ? tmp + Mod : tmp;
}