闲话 23.1.3

闲话

image
新年的军队

例行推歌:パラレルガール / 雄之助 feat. 初音ミク
是好好听的雄氏老方!抓耳朵又有节奏感!已经在单曲循环了!

反正我也不是 A 层 写这个也就图个热闹和水闲话
看得也别太认真 很感性(
当然有问题和挑错可以随时问我!
我不保证能看到
我也不是很经常刷新页面看有没有消息的那种人
如果你 18:00 找我就得做好第二天我才回信的准备(
当然前提是我没想到去看信息 如果想到了我会经常看一眼的(

胡策

感谢大自然的馈赠!(?)
写多项式博客去了(

推流 APJ 的 T1 博客

CF755G 波兰球和球球球

有一排 \(n\) 个球,定义一个组可以只包含一个球或者包含两个相邻的球。现在一个球只能分到一个组中,求从这些球中取出 \(k\) 组的方案数。

\(n\le 10^9\)\(k<2^{15}\)

考虑一个 dp。我们设 \(f_{i, j}\) 表示前 \(i\) 个球取出 \(j\) 组的方案数。考虑转移:

  1. 啥都不取 \(f_{i - 1, j} \to f_{i, j}\)
  2. 取一个单独成组 \(f_{i - 1, j - 1}\to f_{i, j}\)
  3. 取两个一起成组 \(f_{i - 2, j - 1}\to f_{i, j}\)
次元间隙传出的低吼

APJifengc 2022/12/30 15:21:18
但是我搬的这题非常简单

joke3579 2022/12/30 15:21:27
addd

APJifengc 2022/12/30 15:21:36
不是说实话确实很简单

APJifengc 2022/12/30 15:21:47
你看都能一眼切

APJifengc 2022/12/30 15:22:00
CF755G

APJifengc 2022/12/30 15:22:02
特别弱

joke3579 2022/12/30 15:22:26
直接 dp 是吗

APJifengc 2022/12/30 15:22:40

APJifengc 2022/12/30 15:22:41
您切了

joke3579 2022/12/30 15:22:43

joke3579 2022/12/30 15:23:02
谢谢您给我增加水题提交数

我们套路地对第二维求和,直接写出

\[F_i(x) = (1 + x) F_{i-1}(x) + xF_{i - 2}(x) \]

我们构造这个递推式的特征方程,得到

\[p^2 = (1 + x) p + x \]

解得

\[p_1 = \frac{1 + x + \sqrt{(1 + x)^2 + 4x}}{2} \quad p_2 = \frac{1 + x - \sqrt{(1 + x)^2 + 4x}}{2} \]

然后经典设 \(F_n = c_1p_1^n + c_2p_2^n\)。根据 \(F_0 = 1, F_1 = x + 1\),我们能解得

\[\left\{\begin{aligned} c_1 &= p_1(x^2 + 6x + 1)^{-1/2} \\ c_2 &= - p_2(x^2 + 6x + 1)^{-1/2} \end{aligned}\right. \]

因此得到了

\[F_n = \frac{p_1^{n+1} - p_2^{n + 1}}{\sqrt{x^2 + 6x + 1}} \]

由于 \(p_2^{n+1} \equiv 0 \pmod{x^{n + 1}}\),答案的生成函数即为

\[F_n(x) = \frac{\left(1 + x + \sqrt{(1 + x)^2 + 4x}\right)^{n + 1}}{2^{n + 1}\sqrt{x^2 + 6x + 1}} \]

直接实现可以做到 \(O(n\log n)\)。然后我们发现 \(F_n(x)\) \(\text{d-finite}\),因此可以采用线性递推。初值啥的可以在这篇博客看。

我实现了 \(O(n\log n)\) 的小常数做法。Submission.

鰰实现了 \(O(n)\) 的线性递推。Submission.



CF623E

对于一个整数序列 \(\{a_1, a_2, \ldots, a_n\}\),我们定义它的变换为 \(\{b_1, b_2, \ldots, b_n\}\),其中 \(b_i = a_1 | a_2 | \ldots | a_i\),其中 \(|\) 表示二进制按位或运算。

现在求有多少个长为 \(n\) 的序列 \(a\),满足 \(1\leq a_i \leq 2^k - 1\),使得它的变换 \(b\)严格单调递增的,对 \(10^9+7\) 取模。

\(1\leq n \leq 10^{18}\)\(1\leq k \leq 3 \times 10^4\)

\(k\) 个不同的元素里选 \(n\) 次,每次都必须选至少一个新的元素。

image

做法 1:dp 导出卷积

考虑 dp。我们设 \(f_{i, j}\) 为选 \(i\) 次,已经选了 \(j\) 个不同的元素的方案数。然后枚举第 \(i\) 次选了 \(t\) 个新元素,还可以选择旧元素,得到 dp:

\[f_{i,j} = \sum_{t=1}^j 2^{j - t} \binom jt f_{i -1, j - t} = j!\sum_{t=1}^j \frac{1}{t!} \frac{f_{i -1, j - t} 2^{j - t}}{(j - t)!} \]

这就是 \(O(nk\log n)\) 的做法。然后我们发现这个东西每次转移都是相同的,考虑一手倍增。我们设我们需要从 \(f_{a, s} , f_{b, t}\) 转移到 \(f_{a + b, s + t}\),这样的系数是多少。
这其中我们需要从 \(s + t\) 中选出 \(s\) 个先选择的,然后这 \(s\) 个在后选的 \(b\) 次中每次都可以随意选择,即系数就是

\[\binom{s + t}{s} \times \left(2^s\right)^b \]

也就是说,

\[f_{i, j} = \sum_{s = 1}^j f_{a, s} f_{i - a, j - s}\times \binom js \times \left(2^s\right)^b = j! \sum_{s = 1}^j \frac{f_{i - a, j - s}}{(j - s)!}\times \frac{f_{a, s}\left(2^s\right)^b}{s!} \]

\(a = \lfloor i / 2\rfloor\) 即可。最后的答案就是 \(\sum_{i=1}^k f_{n, i} C_k^i\)

直接记忆化分治即可。总时间复杂度 \(O(n\log n)\)

做法 2:生成函数

本做法是 APJifengc 跟我说的。

考虑把转移用 egf 表出。设 \(F_{i}(x)\) 是对第二维求和的 egf,转移就是

\[F_{i}(x) = (e^x - 1) F_{i-1}(2x) \]

展开写下来可以得到

\[F_{n}(x) = \prod_{i=0}^{n-1}(e^{2^ix} - 1) \]

发现没法算了。但是我们可以从中间截断,也就是(对偶数情况的)

\[F_{2n}(x) = \prod_{i=0}^{n - 1}(e^{2^ix} - 1)\times \prod_{i=0}^{n-1} (e^{2^i (2^nx)} - 1) = F_n(x) \times F_n(2^n x) \]

我们直接向一遍递归求得 \(F_n(x)\)。带入 \(2^n x\) 是简单的。因此在偶数情况下可以直接将问题缩小一半。

\(n\) 为奇数的情况大致相同,先求出 \(F_{n-1}(x)\),最后乘入 \(e^{2^{n-1}x} - 1\) 即可。

总时间复杂度 \(O(n\log n)\)

我实现的是做法 1。常数不大,本机开 -O2\(n = k = 2e5\) 的数据也就 1.5s。

Submission.



HDU5909

给定一棵 \(n\) 个节点的树,节点有点权 \(v_i\),求树上节点权值异或和为数 \(x \in [0, m)\) 的子联通块数量,对每个 \(x\) 分别回答。

\(n\le 1000, 0 \le v_i \le m < 2^{10}\)

考虑设 \(f_{i, j}\)\(i\) 节点子树内包含 \(i\) 且权值为 \(j\) 的联通块数。转移就是合并异或背包:

\[f_{u, k} = \sum_{i\oplus j = k} f_{u, i}\times f_{v, j} \]

直接做 FWT 即可。最开始只让 \(f_{u, v_u} = 1\),合并完一个节点子树的所有信息后让 \(f_{u, 0} = 1\) 即可不重不漏。

总时间复杂度 \(O(n^2 \log n)\)

Submission.

posted @ 2023-01-03 15:10  joke3579  阅读(97)  评论(2编辑  收藏  举报