[Baekjoon 19313] Kids Aren't Alright
前言
中文互联网上没有这道题题解, 那我算不算攒功德
思路
题意
给定 , 其中
求 中, 有多少子集满足
- 子集内
- 子集内
不难发现问题可以转化为
对于 \(n = p_1^{c_1}p_2^{c_2} \cdots p_k^{c_k}\) , 要求一个序列 \(\textrm{div}_m : \{a_1, a_2, \cdots, a_k\}\) , 使得
显然 \(k \leq 15\)
这样构造出来的子串 \(p_1^{div_1 : a_1}p_2^{div_1 : a_2} \cdots p_k^{div_1 : a_k}, p_1^{div_2 : a_1}p_2^{div_2 : a_2} \cdots p_k^{div_2 : a_k}, \cdots, p_m^{div_m : a_1}p_2^{div_m : a_2} \cdots p_k^{div_m : a_k}\) 就是答案
怎么计算 \(\textrm{div}\) 的方案数, 正向不好统计, 考虑总方案数减去不合法方案数
对于一个 \(p_j\) , 我们钦定不存在 \(a_j = 0\) 和不存在 \(a_j = c_j\) 的方案, 那么这些方案都不合法, 但会算重, 所以加上同时不存在 \(a_j = 0\) 和不存在 \(a_j = c_j\) 的方案
那么对于多个 \(p_j\) 应该怎么做?
考虑枚举对于一个 \(p_j\)
- \((0)\) 无限制
- \((1)\) 钦定不存在 \(a_j = 0\)
- \((2)\) 钦定不存在 \(a_j = c_j\)
- \((3)\) 钦定不存在 \(a_j = 0\) 且 不存在 \(a_j = c_j\)
那么这样子怎么去重, 不难发现可以按照钦定的数量分类, 也就是说
- \((0)\) 无限制
- \((1)\) 钦定不存在 \(a_j = 0\) 或者 不存在 \(a_j = c_j\)
- \((2)\) 钦定不存在 \(a_j = 0\) 且 不存在 \(a_j = c_j\)
那么如果钦定数量加起来为偶数即为 \(+\) 否则即为 \(-\)
对于这样一个一个三进制数表示的 \(p_j\) 状态, 如何计算方案数
如果是 \(0\) 那么直接乘以 \(c_j + 1\) , 如果是 \(1\) 那么乘以 \(c_j\) , 如果是 \(2\) 那么乘以 \(c_j - 1\)
最终添上 \(2\) 的幂次即可
当前的复杂度是 \(O \Big(w(n) 3^{w(n)} + \sqrt{n} \Big)\)
题解的进一步优化
值得一提的是, 这里对 进行分解是本题的难点: 的复杂度并不可以接受, 但我们并不需要真的得到 , 而是只要知道 即可
我们考虑先分解出所有 的 , 那么剩余部分只有 三种, 其中 都是质数
那么我们先使用 算法判断 的情况, 然后开根号后平方判断 的情况, 剩余的情况就是 的情况了
时间复杂度:
总结
个数不确定的组合数学问题, 往往把所有情况计算出来算上 \(2\) 的幂次
容斥原理常见的确定系数的方法

浙公网安备 33010602011771号