首先考虑 DP,设 \(f_n,g_n\) 分别表示把 \(n\) 个硬币移动到下一个圈 / 下下一个圈的最小步数。
若要把所有硬币移动到下一个圈,首先要把面值最大的移动到下一个圈,然后再把剩下的移到这个圈。
为了将面值最大的移动到下一个圈,要先把剩下的先移到下下个圈,然后再把最大的移到下一个圈。
显然这样可以构建起 \(f_n\) 的 DP 转移方程: \[f_n = 2g_{n-1}+1\]
若要把所有硬币移动到下下个圈,首先要把面海最大的移动到下下个圈,然后再把剩下的移到这个圈。
为了将面值最大的移动到下下个圈,要先把剩下的先移到下下个圈,然后再把最大的移到下一个圈。
然后再将剩下的移回原来的圈,再将最大的移动到下下个圈,然后再把剩下的移到下下个圈。
总结起来就是 \[g_n = 2g_{n-1} + f_{n-1} + 2\]
(我也知道很啰嗦不过这些我相信读者自己能推出来)
然后这里正解是直接矩阵快速幂 + 分块预处理……
我选择推通项(
设 \(F,G\) 为 \(f,g\) 的生成函数,则 \[ \begin{aligned} F(x) &= 2xG(x) + \frac1{1-x} - 1 \\ G(x) &= 2xG(x) + xF(x) + \frac2{1-x} - 2 \end{aligned} \]
用第一条式子替换掉第二条式子中的 \(F(x)\),有 \[ \begin{aligned} G(x) &= 2xG(x) + x(2xG(x) + \frac1{1-x} - 1) + \frac2{1-x} - 2 \\ &= 2x^2G(x) + 2xG(x) + \frac{x+2}{1-x} - x - 2 \\ (1-2x-2x^2)G(x) &= \frac x{1-x}(x+2) \\ G(x) &= \frac x{(1-x)[1-(1+\sqrt3)x][1-(1-\sqrt3)x]}(x+2) \\ G(x) &= \frac16(x+2)\left[\frac{1+\sqrt3}{1-(1+\sqrt3)x} + \frac{1-\sqrt3}{1-(1-\sqrt3)x}\right] \\ g_n &= (1+\sqrt3)^n \left(\frac12+\frac13\sqrt3\right) + (1-\sqrt3)^n \left(\frac12-\frac13\sqrt3\right) - 1 \end{aligned} \] (省去了因式分解部分分式等一系列步骤)
然而,可惜的是!\(3\) 不是模 \(998244353\) 的二次剩余!
不过我们依然可以扩域,即把每个数表示为 \(a + b\sqrt3\) 的形式,然后分块预处理幂。
代码:
1 |
|