闲话 23.1.3
闲话
例行推歌:パラレルガール / 雄之助 feat. 初音ミク
是好好听的雄氏老方!抓耳朵又有节奏感!已经在单曲循环了!
反正我也不是 A 层 写这个也就图个热闹和水闲话
看得也别太认真 很感性(
当然有问题和挑错可以随时问我!
我不保证能看到
我也不是很经常刷新页面看有没有消息的那种人
如果你 18:00 找我就得做好第二天我才回信的准备(
当然前提是我没想到去看信息 如果想到了我会经常看一眼的(
胡策
感谢大自然的馈赠!(?)
写多项式博客去了(
有一排 \(n\) 个球,定义一个组可以只包含一个球或者包含两个相邻的球。现在一个球只能分到一个组中,求从这些球中取出 \(k\) 组的方案数。
\(n\le 10^9\),\(k<2^{15}\)。
考虑一个 dp。我们设 \(f_{i, j}\) 表示前 \(i\) 个球取出 \(j\) 组的方案数。考虑转移:
- 啥都不取 \(f_{i - 1, j} \to f_{i, j}\)。
- 取一个单独成组 \(f_{i - 1, j - 1}\to f_{i, j}\)
- 取两个一起成组 \(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_n = c_1p_1^n + c_2p_2^n\)。根据 \(F_0 = 1, F_1 = x + 1\),我们能解得
因此得到了
由于 \(p_2^{n+1} \equiv 0 \pmod{x^{n + 1}}\),答案的生成函数即为
直接实现可以做到 \(O(n\log n)\)。然后我们发现 \(F_n(x)\) \(\text{d-finite}\),因此可以采用线性递推。初值啥的可以在这篇博客看。
我实现了 \(O(n\log n)\) 的小常数做法。Submission.
鰰实现了 \(O(n)\) 的线性递推。Submission.
对于一个整数序列 \(\{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\) 次,每次都必须选至少一个新的元素。
做法 1:dp 导出卷积
考虑 dp。我们设 \(f_{i, j}\) 为选 \(i\) 次,已经选了 \(j\) 个不同的元素的方案数。然后枚举第 \(i\) 次选了 \(t\) 个新元素,还可以选择旧元素,得到 dp:
这就是 \(O(nk\log n)\) 的做法。然后我们发现这个东西每次转移都是相同的,考虑一手倍增。我们设我们需要从 \(f_{a, s} , f_{b, t}\) 转移到 \(f_{a + b, s + t}\),这样的系数是多少。
这其中我们需要从 \(s + t\) 中选出 \(s\) 个先选择的,然后这 \(s\) 个在后选的 \(b\) 次中每次都可以随意选择,即系数就是
也就是说,
取 \(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_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。
给定一棵 \(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\) 的联通块数。转移就是合并异或背包:
直接做 FWT 即可。最开始只让 \(f_{u, v_u} = 1\),合并完一个节点子树的所有信息后让 \(f_{u, 0} = 1\) 即可不重不漏。
总时间复杂度 \(O(n^2 \log n)\)。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230103.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。