Loading

[Baekjoon 19313] Kids Aren't Alright

前言

中文互联网上没有这道题题解, 那我算不算攒功德

思路

题意

给定 nn , 其中 1n10181 \leq n \leq 10^{18}
{1,2,3,,n}\{1, 2, 3, \cdots, n\} 中, 有多少子集满足

  • 子集内 gcd=1\gcd = 1
  • 子集内 lcm=n\textrm{lcm} = n

不难发现问题可以转化为
对于 \(n = p_1^{c_1}p_2^{c_2} \cdots p_k^{c_k}\) , 要求一个序列 \(\textrm{div}_m : \{a_1, a_2, \cdots, a_k\}\) , 使得

\[\begin{align} \min_{i = 1}^{m} \textrm{div}_i : a_j = 0 \\ \max_{i = 1}^{m} \textrm{div}_i : a_j = c_j \end{align}\]

显然 \(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)\)

题解的进一步优化

值得一提的是, 这里对 nn 进行分解是本题的难点:Θ(n)\Theta(\sqrt{n}) 的复杂度并不可以接受, 但我们并不需要真的得到 p1,p2,,pkp_1, p_2, \cdots, p_k, 而是只要知道 α1,α2,,αk\alpha_1, \alpha_2, \cdots, \alpha_k 即可
我们考虑先分解出所有 pin3p_i \leq \sqrt[3]{n}piαip_i^{\alpha_i}, 那么剩余部分只有 p,p2,pqp, p^2, pq 三种, 其中 p,qp, q 都是质数
那么我们先使用 Miller Rabin\textrm{Miller Rabin} 算法判断 pp 的情况, 然后开根号后平方判断 p2p^2 的情况, 剩余的情况就是 pqpq 的情况了
时间复杂度: Θ(n3+3ω(n)ω(n))\Theta(\sqrt[3]{n} + 3^{\omega(n)}\omega(n))

总结

个数不确定的组合数学问题, 往往把所有情况计算出来算上 \(2\) 的幂次

容斥原理常见的确定系数的方法

posted @ 2025-02-20 21:01  Yorg  阅读(75)  评论(0)    收藏  举报