2023.6.12 闲话 [C]

推歌:イナイイナイ依存症 - MARETU × かいりきベア feat. 初音ミク .

推歌:Ether Strike - Akira Complex .

好像和上一篇的 Axium Crisis 呼应了 . 脑放 Ether Strike 总是自己进异象,怎么破 .

Do not open


机场修建 被各路比标算简洁的做法做到 \(\Theta(n\sqrt n)\) 线性空间,果然是学傻了 .

Gtrimee 是刚结束没几天就有一些多项式神仙过来吊打标算,不过也是预料之内的了,膜拜大神 . 其实好像是单组询问的话有很多更厉害的做法 .

Gtrimee 只用一次求逆做法大概就是令二叉树方程是 \(w\),然后答案就肯定能表示为大概是 \(w,z\) 和其 \(k\) 次方相关的有理分式,然后考虑咋 \(\Theta(n)\)\(w^k\) .

听说 \([z^n]w^k=\dfrac k{n+k}\dbinom{2n+k-1}n\),这样就行了,具体没咋想,应该也想不出来 .

水军带你飞大神好像也是写的这个,不过问他做法却是说「跟题解是一样的(」,可能是认为这一步过于显然一眼秒了?/wq/bx

求单点是可以线性的 . 先挂一个答案表达式:

\[F_k(z)=z\cdot \dfrac{w^{2k-1}z^k+2w^2z-wz-w}{w^{2k}z^{k+1}+2wz-z-1} \]

具体做法大概就是,令 \(u=w-1\),那么代入 \(z=\dfrac u{w^2}\),则可以线性将答案表为关于 \(u\) 的有理分式 . 从而只需要将多项式复合上 \(u\) 的某处系数 .

因为 \(u\) 常数项是 0 所以可以 \(n\) 处截断,这样只需要求 \([z^n]u^k\) 之后就可以算了,这个算的方法和 \([z^n]w^k\) 基本一样 .

upd. 感觉不如直接拉反 .

这些厉害做法都是 xiaoyaowudi 说的,膜拜 xiaoyaowudi 大神 .

NaCly_Fish 指出,似乎可以使用 count 的方法可以将答案表为 \(\Theta(n/k)\) 个组合数之和,具体可见 EI blog .

我暂且,额。

因为古有 joke 大神闲话里只有命题报告,所以我也想只放命题报告水一篇闲话 .

放个题面先:

Gtrimee

令满足如下条件的儿子有序的无标号有根树数量为 \(w_k(n)\)

  • 点数 \(n_0\in[1,n]\)
  • 所有深度为 \(k\) 的点都不是叶子。

给定固定正整数 \(k\),多次给定正整数 \(n\),求 \(w_k(n)\bmod 998244353\) 的值。

此处一个点的深度定义为它到根的唯一简单路径的长度,比如根的深度就是 \(0\)

\(1\le n,q,k\le 2\times10^5\)

关于题目名字……Grimace + Tree = Gtrimee?我要推歌了:あんたにあっかんべ / 一二三 feat.初音ミク .

其实这个「线性分式变换」的方法还是 APJifengc 加压下的产物,本来我是直接用波特算的,APJ 说人类要能算,于是胡了一个这个,APJ 顺着写了一份跑 4s 左右 . 后来有人拿矩阵快速幂算了这个,跑的比 std 都快,真恐怖 .

题解:

\(n\) 个点的满足题意的树的数量 \(f_k(n)\) 的 OGF 为 \(F_k(z)\),那么枚举根的最左侧子树大小即可得到递推:

\[f_k(n)=\sum_{i=0}^{n-1}f_{k-1}(i)f_k(n-1-i) \]

翻译为 OGF 就是卷积形式 \(F_k(z)=1+zF_{k-1}(z)F_k(z)\),即

\[F_k(z)=\dfrac1{1-zF_{k-1}(z)} \]

通过类似的方法可以推得 \(F_1(z)\) 的表达式,于是只需要解出递推 .

\(p=998244353\) . 定义线性分式变换为函数 \(f:\mathbb F_p[[z]]\to\mathbb F_p[[z]]\),满足存在 \(a,b,c,d\in \mathbb F_p[[z]]\),使得

\[f(x)=\dfrac{ax+b}{cx+d} \]

那么可以发现线性分式变换对于复合是封闭的,具体可以验证:

\[\dfrac{a_0\frac{a_1x+b_1}{c_1x+d_1}+b_0}{c_0\frac{a_1x+b_1}{c_1x+d_1}+d_0}=\dfrac{(a_0a_1+b_0c_1)x+(a_0b_1+b_0d_1)}{(c_0a_1+d_0c_1)x+(c_0b_1+d_0d_1)} \]

观察递推,看成线性分式变换的形式就是 \(a=0,\,b=1,\,c=1,\ d=-z\) . 令 \(F_k(z)=\dfrac{a_kF_1(z)+b_k}{c_kF_1(z)+d_k}\),则可以简单写出系数的递推:

\[\begin{aligned}&a_i=c_{i-1}\\&b_i=d_{i-1}\\&c_i=c_{i-1}-z\cdot a_{i-1}\\&d_i=b_{i-1}-z\cdot d_{i-1}\end{aligned} \]

那么不难发现的是这个递推本质上可以看做二阶常系数齐次线性递推,于是大力解出 \(a,b,c,d\) 后代入即可 .

于是可以通过多项式基本操作在 \(\Theta(n\log n)\) 的时间复杂度内求出 \(F_k(z)\) 的前 \(n\) 项系数 . 前缀和后即为答案 . 时间复杂度为 \(\Theta(n\log n+q)\),可以通过 . 如果实现优秀是可以跑到 500ms 以内的 .

关于加强的话开头已经说过了,那我就不复读了,要看答案的表达式可以看 xiaoyaowudi 老师的题解 . 也不能像 joke 一样扔个 Bonus 让读者自己思考吧 .

增强文章生动性,使文章产生悬念,更能引人入胜,同时也可以避免叙述的平板和结构的单调……

posted @ 2023-06-12 14:28  Jijidawang  阅读(135)  评论(6编辑  收藏  举报
😅​