【CF908E】New Year and Entity Enumeration(观察,结论)
给定集合 \(S'\),考虑其生成集合 \(S\) 将会是啥样。
将 \(m\) 个位划分成若干个等价类,使得若 \(i_1,\cdots,i_k\) 在同一等价类,对于任意 \(x\in S'\) 有 \(x\) 的第 \(i_1,\cdots,i_k\) 位都是一样的。显然经过取反和按位与之后,原来相等的位置间仍然是相等的,那么刚刚那个条件应该对任意 \(x\in S\) 也成立。
另一方面,假设共有 \(K\) 个等价类,我们说明 \(S\) 的大小恰为 \(2^K\),即任意对每个等价类选取为 \(0/1\) 所得到的数都在 \(S\) 中。
首先,容易通过取反和按位与构造出按位或(类似 \(\max(x,y)=-\min(-x,-y)\))。然后,通过将 \(S'\) 中所有第 \(i\) 个等价类为 \(1\) 的数按位与起来,就能得到一个数,它只有第 \(i\) 个等价类为 \(1\) 而其他等价类为 \(0\)。再通过把若干个这种数按位或起来即可得到任意想要构造的数。
于是 \(S\) 的形态只与所有等价类的形态有关。回到原问题,\(T\) 相当于已经给出了若干个等价类(称为基础等价类),而我们可以在此基础上对每个等价类划分出更细的等价类,然后得到 \(S\)。那么总方案数即为每个基础等价类的集合划分数的乘积。
如何找基础等价类?对每个位在哪些数内为 \(1\) 进行状压,哈希值相同的就是同一个等价类。
集合划分数的求法:可以用第二类斯特林数的列和,也可以枚举第一个位所在的等价类大小递推。