数据范围奇葩的状压 DP
一般状压 DP 都会有某些明显可以成为指数的数据范围,例如 \(n \le 20\) or \(b \le 7\),这种题直接对着数据范围 DP 就好了,但有一些非常规的。
Problem 1 寿司晚宴
从 \([2,n]\cap \mathbb{Z}\) 中找出两个不交子集 \(S,T\) 使 \(\forall s \in S,t\in T:\gcd(s,t)=1\),求方案数。
\(1 \le n \le 500\)。
首先将 \(2,3,\dots,n\) 分解质因数,这样 \(\gcd(s,t)=1\) 的充要条件是 \(s\) 和 \(t\) 不存在相同质因子。
直接状压 DP,令 \(f_{A,B}\) 表示 \(S\) 集合选的数的质因子的集合为 \(A\),\(T\) 集合选的数的质因子的集合为 \(B\) 的方案总数。具体 DP 时从 \(2\) 扫到 \(n\) 就可以了。这样做时间复杂度为 \(\mathcal O(n2^{2p(n)})\),\(p(n)\) 是 \(n\) 以内质因子的个数。也可以优化为 \(\mathcal O(n3^{p(n)})\),为枚举子集的大小。
这样做炸到天上去了。仔细一想,发现小于等于 \(n\) 的数的质因子最多只有一个大于 \(\sqrt n\),这是显然的。再一看,\(\le \sqrt n = 22\) 的总共只有 \(8\) 个质因子,也就是 \(2,3,5,7,11,13,17,19\)。因此我们只需要记录具有相同的大于 \(22\) 的质因子,把他们放到同一组内,像分组背包一样转移即可。时间复杂度 \(\mathcal O(n3^{p(\sqrt n)})=\mathcal O(n3^8)\)。
Problem 2 Burza
略

浙公网安备 33010602011771号