24/04/29 杂(容斥、数论、图论)

\(\color{blue}(1)\) P2606 [ZJOI2010] 排列计数

  • 求有多少 \(1 \sim n\) 的排列 \(p\) 满足 \(\forall i \in[2, n], p_i > p_{\lfloor i/2 \rfloor}\),对 \(m\) 取模。

  • \(n \le 10^6\)\(m \le 10^9\)\(m\) 是一个质数。

观察发现 \(p_i > p_{\lfloor i/2 \rfloor}\) 这个条件与小根堆的性质类似。问题就转化成了:

有多少种给 \(n\) 个节点的完全二叉树分配权值 \(1 \sim n\) 的方案,使得每个父亲的权值都小于左右儿子的权值。(原问题)

我们可以先将这 \(n\) 个点建出来,预处理出每个节点的子树大小 \(s_u\)。注意到树的形态与根类似,所以我们仍然用 \(2u\)\(2u + 1\) 表示 \(u\) 节点的左右儿子。

然后考虑 DP。设 \(f_u\) 表示在 \(u\) 的子树中分配权值 \(1 \sim s_u\) 且每个父亲的权值都小于左右儿子的权值的方案数,可以不严谨地理解为原问题在以 \(u\) 为根的树上且 \(n = s_u\) 时的答案。

考虑计算 \(f_u\)。令左右儿子 \(l = 2u, r = 2u + 1\)。显然 \(u\) 的权值必定为 \(1\),因为它是这颗子树中最小的。剩余的 \(l, r\) 子树中的点所分配的权值,我们需要用某种方式将它们合并起来。

显然我们会改变 \(l, r\) 内子树点的权值(因为之前我们都是从 \(1, 2\dots\) 开始编号的),但是并不会改变两棵子树内部的点权值的相对关系。那么方案数就是可重集排列的计算,即 \(\dfrac{(s_l + s_r)!}{s_l! \cdot s_r!}\)

而两棵子树内部的答案分别为 \(f_l, f_r\),那么转移式即 \(f_u = f_l \cdot f_r \cdot \dfrac{(s_l + s_r)!}{s_l! \cdot s_r!}\)。叶节点的 dp 值为 \(1\)

最后输出 \(f_1\) 即可,表示整棵树的答案。

\(\color{blue}(2)\) P2398 GCD SUM

  • \(\sum\limits_{i=1}^n \sum\limits_{j=1}^n \gcd(i, j)\)
  • \(n \le 10^5\)

推式子。

\[\begin{aligned} \sum_{i=1}^n \sum_{j=1}^n \gcd(i, j) &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d \mid \gcd(i, j)}\varphi(d) \\ &= \sum_{i=1}^n \sum_{j=1}^n \sum_{d \mid i 且 d \mid j}\varphi(d) \\ &= \sum_{d=1}^n \varphi(d) \left\lfloor\dfrac nd\right\rfloor^2 \end{aligned} \]

线性筛 \(\varphi\) 即可。

\(\color{blue}(3)\) P1450 [HAOI2008] 硬币购物

  • 共有 \(4\) 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)。某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\)\(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。
  • \(c_i, d_i, s \le 10^5\)\(n \le 10^3\)

若我们分别购买了四种商品 \(x_1, x_2, x_3, x_4\) 件,那么需要满足的条件为 \(0 \le x_i \le d_i\)

发现这个上界是做不了的,但是下界的处理是极易的。我们思考这些问题:

  1. 求满足 \(x_i \ge 0\)(也就是无限制)时,凑成 \(s\) 的方案数。

显然是完全背包。预处理即可。

  1. 求满足 \(x_i \ge d_i\)\(d_i\) 给定)时,凑成 \(s\) 的方案数。

既然至少要买 \(d_i\) 件,那么我们先将这 \(d_i\) 件买上,即 \(s \gets s - \sum c_id_i\)。然后就是第一个问题了。

  1. 求满足 \(0 \le x_i \le d_i\)\(d_i\) 给定)时,凑成 \(s\) 的方案数。即本题。

容斥。我们有公式:

\[\left| \bigcap_{i=1}^n S_i\right| = |U| - \left| \bigcup_{i=1}^n \overline{S_i} \right| \]

即「\(n\) 个条件都满足的方案数」等于「总方案数」减去「至少一个条件不满足的方案数」。

在本题中,「\(n\) 个条件都满足的方案数」即 \(\forall i, 0 \le x_i \le d_i\),「至少一个条件不满足的方案数」即 \(\exist i, x_i \ge d_i + 1\)

那么我们用 \(2^4\) 的复杂度枚举哪些条件是不满足的,即哪些 \(i\) 需要满足 \(x_i \ge d_i + 1\)。然后转化成了问题二。乘上容斥系数累加答案即可。

\(\color{purple}(4)\) CF76A Gift

  • 一张图,每条边有两个属性 \((g_i, s_i)\)。给定 \(G, S\),求一棵图的生成树 \(T\),使得 \(G \times \max(g_i) + S \times \max (s_i)\) 最小(\(i \in T\))。
  • \(n \le 200\)\(m \le 5 \times 10^4\)

枚举 \(i\) 并加入所有 \(g_j \le g_i\) 的边 \(j\),这样就固定了 \(g_i\) 是最大值。

接下来我们将刚才加入的边按照 \(s_i\) 跑最小生成树,然后就能轻易地计算答案了。

此时复杂度为 \(\Theta(m^2 \log m)\),无法通过。

可以发现将边按照 \(g_i\) 从小到大排序后,每次加入一条新的边时,我们只需要将上一轮的 MST 中的 \(n -1\) 条边与这条边结合,从而计算新的 MST,而不需要将前 \(i\) 条边全部重新计算。因此复杂度降到了 \(\Theta(nm \log n)\)

posted @ 2024-04-29 20:20  2huk  阅读(9)  评论(0编辑  收藏  举报