闲话 23.1.30
闲话
我要学符号化方法!
知识面被狠狠踩了!
所以这几天闲话可能会比较水吧(
今日推歌:命运 / Fate (Type.B) - Yasuha. feat. 初音ミク
其他几首也各有风味呢!可以听一听!
杂题
对于一个正整数 \(n\),我们称满足以下条件的有根二叉树是一棵美丽的 \(n\) 阶二叉树。
- 每个节点有一个数字 \(0\) 或 \(1\),节点 \(i\) 的数字记为 \(a_i\)。
- 每个叶子节点的数字定是 \(1\)。
- 可以通过进行如下的操作至多 \(n - 1\) 次,使得最终根节点上的数字为 \(n\),其余节点的数字是 \(0\)。
- 选择两个节点 \(u, v\),其中 \(u\) 需要是 \(v\) 的父节点或父节点的父节点。作赋值 \(a_u\leftarrow a_u + a_v, a_v\leftarrow 0\)。
给定 \(n\),请计算美丽的 \(n\) 阶二叉树的数量。答案对 \(998244353\) 取模。
\(n \le 10^7\)。
ABC 也要科技普及!
观察可以得到,一棵二叉树是美丽的,当且仅当其根节点的数字是 \(1\),且不存在一条边两端点的数字均为 \(0\)。
考虑一个朴素的 dp。我们令 \(f(n, 0/1)\) 为根节点的数字为 \(0/1\) 的美丽 \(n\) 阶二叉树的数量,可以通过枚举儿子的数量得到转移
这个形式很像卷积,我们不妨构造生成函数来刻画这个性质。设 \(F_{0/1}(x)\) 是 \(f(n, 0/1)\) 的普通生成函数。下面由于占位元均为 \(x\),简略表示 \(F_{0/1}(x)\) 为 \(F_{0/1}\)。对比形式不难将上面的转移写作
带入 \(F_0\) 的表达式到 \(F_1\) 表达式中得到
我们能发现
这启发我们寻找 \(F_1\) 的复合逆,设它为 \(G(x)\)。当然 \(G\) 的形式可以直接写出,就是
应用拉格朗日反演可以得到
因此我们现在只需要着眼于
容易发现 \(H(x) = \left(x^2 + 3x + 1\right)^{2n}\) 微分有限,可以递推。可以直接求 ODE,写出得到
也就是
两边提取 \(x^k\) 项系数可以得到
化简可以得到
初值有 \(H[0] = 1, H[1] = 6n\),递推后带入 \(H[n - 1]\) 到原式即可。
总时间复杂度 \(O(n)\)。
upd:直接上 ode 自动机 + 整式递推,可以直接 \(O(\sqrt n \log n)\) 求算 \([x^n] \left(x^2 + 3x + 1\right)^{2n}\) 的系数。
容易发现不互质的一系列数字在 Bob 调整的时候相对顺序不会变,从这点着手。
我们对每个元素建点,两个不互质的元素间连边,这能组成一个图。
先手需要的是对这个图里每个联通块定向,这些定了向的边表示最后的顺序中不变的相对顺序,因此贪心地从每个联通块内对应元素最小的点开始,从小到大扫描这个联通块。这样就能定向,得到一个 dag 图。
后手需要的是对这个 dag 图得到一组最大的拓扑排序的结果,因此直接用优先队列维护即可。
总时间复杂度 \(O(n^2)\)。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat230130.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。