P8292 [省选联考 2022] 卡牌
题意
给出一个序列 \(S\),\(Q\) 组询问每次给出一个质数集合,求有多少个 \(S\) 的子集满足子集元素的乘积可以被每个质数整除。\(S_i\le 2000\)
思路
首先我们只需要统计每一个不同的 \(S_i\) 有多少个。之后我们考虑每一个 \(S\) 的质因数集合,相当于选择若干集合的并使得包含这个质数集合,这是一个 NPH 问题。
我们考虑这个强制要求是倍数很难考虑的,那么正难则反。问题的补问题是强制要求不选择 \(k\) 个质数的方案数,然后容斥原理就是答案。
之后我们考虑质数的乘积是很大的,注意到 \(43*47=2021>2000\),也就是说明每一个数至多只有一个 \(\ge 43\) 的质因数,而小于 \(43\) 的质数只有 \(13\) 个。那么我们考虑容斥 \(f_{s,j}\) 表示 \(s\) 状态的小质数不能选,还必须是 \(j\) 个大质数的倍数的情况。
这样对于给出质数集合我们分为大质数集合 \(Q_{\text{big}}\) 和小质数集合 \(Q_{\text{small}}\)。根据容斥原理我们枚举 \(Q_{\text{small}}\) 的子集 \(s\)。然后对于所有的 \(Q_{\text{big}}\) 的元素 \(x\),从 \(f_{s,x}\) 中必须要选择一个,所以方案数是 \(2^{f_{s,x}}-1\)。再预处理一下 \(f_s\) 的和,然后减去所有的 \(f_{s,x}\) 就是随便选的情况,乘上这个 \(2^{\Delta}\) 就是答案。

浙公网安备 33010602011771号