高维前缀和

又叫 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:一个东西不多说。

posted @ 2022-12-01 11:09  Feynn  阅读(25)  评论(0编辑  收藏  举报