一些小技巧(持续更新。。)

二进制集合枚举子集

枚举一个二进制集合的子集,可以看做原集合忽略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;
}
posted @ 2018-12-30 16:25  zzy2005  阅读(243)  评论(3编辑  收藏  举报