设第
i 个人喜欢吃的蛋糕的 bitmask 为
s[i],设所有奇数片蛋糕的 bitmask 为
D
那么能选
i,j 两个人当且仅当
s[i]∩s[j]∩D=0
考虑某个 bitmask
k 能被哪几对
i,j 得到,即求出:
cnt[k]=1≤i<j≤m∑[s[i]∩s[j]∩D=0][s[i]∣s[j]=k]
这是子集卷积的变形,即:
cnt[k]=1≤i<j≤m∑[(s[i]∩D)∩(s[j]∩D)=0][s[i]∣s[j]=k]
考察正常的子集卷积的推导方式:
i∪j=ki∩j=0⇒∣i∣+∣j∣=∣i∪j∣
因此加上一维 popcnt,内层使用 FWT 做 or 卷积即可。
那么在这里
i∪j=ki∩j∩D=0⇒∣i∩D∣+∣j∩D∣=∣(i∩D)∪(j∩D)∣=∣(i∪j)∩D∣
于是初始化时:
a[popcnt(i∩D)][i]+=1
在取出答案时:
ans=a[popcnt(i∩D)][i]
就做完了,注意要把
i=j 的多算的部分减掉,再把答案除以二
时间复杂度
O(2n×n2+∑ai),空间复杂度
O(2n×n)