1 条题解
-
0
- 1
信息
- ID
- 162
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者
前置知识:Hall定理,高维前缀和
首先很容易可以建一个二分图,左边n≤20个点是每种人,右边m个点表示座位。原点到左边的点的权值=有多少人,如果左边某种人可以坐那个作为就连接一个权值为1的边。现在就是问这个二分图匹配能不能把左边流量流满。
考虑Hall定理,枚举一个左边的集合S,设f(S)=∑i∈Sai,那么我们就需要查询[1,m]中有多少整数至少可以被S中的一个整除,设为g(S)。根据Hall定理,如果∀S⊆[n],f(S)≥g(S),就说明可以匹配,输出Yes
现在的问题是计算g根据容斥原理,g(S)=∑T⊆S(−1)∣T∣+1h(T)其中h(T)表示[1,m]中是T所有元素的倍数的数的个数。h(T)=⌊∏k∈Tbkm⌋。g是(−1)∣T∣+1h(T)的高维前缀和,使用FWT优化即可。
总复杂度O(n2n)不使用FWT是O(n2n+3n)