先考虑把所有数取反,问题变成求使得所有数的或和为全集,且任意一个缺一个数的子集的或和都不为全集的方案数
考虑dp,f[i][j][k]表示在前i个数中选了一些,这些数或和为j,要求k是后n-i个数里选出来的数的或和的子集的方案数
不要问我为什么会有这种鬼畜状态-_-
那么考虑转移,设第i+1个数为x,假设第i+1个数不选,那么f[i+1][j][k]+=f[i][j][k]
如果第i个数选,那么我们先保证x不是前面选的数的子集,即以下转移要求x&j!=x
经WerKeyTom_FTD神犇提醒,观察下面的转移式,我们发现当x&j==x的时候,相当于没做转移,所以不用判这个
那么考虑用所有的方案减去x是后面选的数的子集的方案,即
f[i+1][j|x][k^(k&x)]+=f[i][j][k]//所有的的方案
f[i+