二进制集合枚举子集
枚举一个二进制集合的子集,可以看做原集合忽略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;
}