高维前缀和
又叫 SOSdp。一般而言可以使用高维前缀和来统计形如: \(s_x=\sum\limits_{y\&x=y}a_y\) 的问题。代码上的形式如下:
for(int i=0;i<20;++i)
for(int j=0;j<n;++i)
if((1<<i)&j) S[j]+=(S[j^(1<<i)]);
CF449D:考虑求有多少子集与起来不为 \(0\)。令 \(num_x\) 为包含 \(x\) 的数的数量(可以用高维前缀和求得),那么与的结果包含 \(x\) 的方案数 \(f_x=2^{num_x}-1\),于是使用子集反演可以求出有多少子集与起来不为 \(0\),用总数减即可。复杂度 \(O(N\log N)\)。
P6442:相似地,令 \(num_x\) 为 \(x\) 包含的数的个数,那么结果被 \(x\) 包含的方案也就是 \(f_x=2^{num_x}-1\)。然后反演可以求出有多少方案没有包含所有数,然后就可以得出答案了。
CF383E:一个东西不多说。