感谢强大 alpha!!1【4】
Qiuly
·
·
个人记录
往期回顾:
- 感谢强大 alpha!!1【1】
- 感谢强大 alpha!!1【2】
- 感谢强大 alpha!!1【3】
考虑完整的一段的 GF 为 u,那么答案为 [x^n]u^{m}(令 m=k-1)。
考虑 u 是什么,发现和此默慈金数相关 —— 我们令 M 为默慈金数的 GF,根据递推式 M_{n+1}=M_n+\sum\limits_{i=0}^{n-1}M_iM_{n-1-i},有 1+(x-1)M+x^2M^2=0,即 M=\frac{1-x-\sqrt{1-2x-3x^2}}{2x^2} 。
于是 u 其实就是限定首尾两步得到的结果,即 u=x^2M+x=\frac{1+x-\sqrt{1-2x-3x^2}}{2},显然 u 是 D-finite 的。
此时 u' 有:
\begin{aligned}
u'=\left(\frac{1+x-\sqrt{1-2x-3x^2}}{2}\right)'&=\frac{1}{2}\left(1+\frac{1+3x}{\sqrt{1-2x-3x^2}}\right)\\
&=\frac{1}{2}\frac{1-2x+3x^2+(1+3x)\sqrt{1-2x-3x^2}}{1-2x-3x^2}\\
&=\frac{1+x-(1+3x)u}{1-2x-3x^2}
\end{aligned}
考虑令 H(x)=u^{m},有 mH=u\frac{H'}{u'},展开:
\begin{aligned}
H'=H\cdot mu'u^{-1}&=H\cdot m\frac{(1+x){\color{red}{u^{-1}}}-1-3x}{1-2x-3x^2}\\
\end{aligned}
$$
\begin{aligned}
H'=H\cdot mu'u^{-1}&=H\cdot m\frac{(1+x){\color{red}{u^{-1}}}-1-3x}{1-2x-3x^2}\\
&=H\cdot m\frac{(1+x){\color{red}{\frac{1+x-u}{x+x^2}}}-1-3x}{1-2x-3x^2}\\
&=H\cdot m\frac{1-3x^2-u}{x\left(1-2x-3x^2\right)}\\
\end{aligned}
$$
但这还不够,因为根号下的部分并不好处理。我们尝试拆开 $H''$:
$$
\begin{aligned}
H''&=m\left(H'\cdot \frac{1-3x^2-u}{x\left(1-2x-3x^2\right)}+H\cdot \left(\frac{1-3x^2-u}{x\left(1-2x-3x^2\right)}\right)'\right)\\
&=H\cdot m\left(m\frac{(1-3x^2-u)^2}{x^2\left(1-2x-3x^2\right)^2}+\left(\frac{1-3x^2-u}{x\left(1-2x-3x^2\right)}\right)'\right)\\
&=H\cdot m\left(m\frac{(1-3x^2-u)^2}{x^2\left(1-2x-3x^2\right)^2}+\frac{-(1-4x-6x^2+9x^4)+(1-4x-9x^2)u-x(1-2x-3x^2)u'}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H\cdot m\left(m\frac{(1-3x^2-u)^2}{x^2\left(1-2x-3x^2\right)^2}+\frac{(1-3x-6x^2)u-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H\cdot m\left(m\frac{1-6x^2+9x^4-(2-6x^2)u+{\color{blue}{u^2}}}{x^2\left(1-2x-3x^2\right)^2}+\frac{(1-3x-6x^2)u-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H\cdot m\left(m\frac{1-6x^2+9x^4-(2-6x^2)u+{\color{blue}{(1+x)u-(x+x^2)}}}{x^2\left(1-2x-3x^2\right)^2}+\frac{(1-3x-6x^2)u-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H\cdot m\left(m\frac{-(1-x-6x^2)u+(1-x-7x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}+\frac{(1-3x-6x^2)u-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
\end{aligned}
$$
此时我们尝试组合 $H',H'',H$,我们发现:
$$
\begin{aligned}
H''&=H\cdot m\left(m\frac{-(1-x-6x^2)u+(1-x-7x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}+\frac{(1-3x-6x^2)u-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H\cdot m\left(\frac{-\left(m(1-x-6x^2)-(1-3x-6x^2)\right)u}{x^2\left(1-2x-3x^2\right)^2}\right)+H\cdot m\left(\frac{m(1-x-7x^2+9x^4)-(1-3x-5x^2+9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H'\cdot m\left(\frac{m(1-x-6x^2)-(1-3x-6x^2)}{x(1+x)(1-3x)}\right)+H\cdot m\left(\frac{m(2x^2-3x^3-9x^4)-(4x^2-9x^3-9x^4)}{x^2\left(1-2x-3x^2\right)^2}\right)\\
&=H'\cdot \left(\frac{m(1-x-6x^2)-(1-3x-6x^2)}{x(1+x)(1-3x)}\right)+H\cdot m\left(\frac{m(2+3x)-(4+3x)}{(1+x)^2(1-3x)}\right)\\
\end{aligned}
$$
也就是说:
$$
\begin{aligned}
x(1+x)^2(1-3x)H''=&H'\cdot (1+x)(m(1-x-6x^2)-(1-3x-6x^2))+\\
&H\cdot m(m(2x+3x^2)-(4x+3x^2))\\
\end{aligned}
$$
递推即可。时间复杂度 $O(n\log p)$(上面的递推式有个逆元我不会预处理 ... 所以暴力算逆元)。
```cpp
int n, k, inv[N], C0[3], C1[4], C2[5], H[N];
signed main () {
IN (n), IN (k), -- k;
if (k > n || ! k) return puts ("0"), 0;
inv[1] = 1;
lep (i, 1, n) inv[i] = mul (mod - mod / i, inv[mod % i]);
// C0
C0[1] = dec (mul (k, 2), 4);
C0[2] = dec (mul (k, 3), 3);
lep (i, 1, 2) C0[i] = mul (C0[i], k);
// C1
C1[0] = dec (mul (k, 1), 1);
C1[1] = dec (mul (k, mod - 1), mod - 3);
C1[2] = dec (mul (k, mod - 6), mod - 6);
rep (i, 2, 0) pls (C1[i + 1], C1[i]);
// C2
C2[1] = 1, C2[2] = 2, C2[3] = 1;
rep (i, 3, 1) sub (C2[i + 1], mul (C2[i], 3));
// H
H[k] = 1, H[k + 1] = k, H[k + 2] = add (k, (1ll * k * (k - 1) / 2) % mod);
lep (i, k + 2, n - 1) {
int ret = 0, coef = 0;
sub (coef, mul (C2[1], mul (i + 1, i)));
pls (ret, mul (H[i], mul (C2[2], mul (i, i - 1))));
pls (ret, mul (H[i - 1], mul (C2[3], mul (i - 1, i - 2))));
pls (ret, mul (H[i - 2], mul (C2[4], mul (i - 2, i - 3))));
pls (coef, mul (C1[0], i + 1));
sub (ret, mul (H[i], mul (C1[1], i)));
sub (ret, mul (H[i - 1], mul (C1[2], i - 1)));
sub (ret, mul (H[i - 2], mul (C1[3], i - 2)));
sub (ret, mul (H[i - 1], C0[1]));
sub (ret, mul (H[i - 2], C0[2]));
H[i + 1] = mul (ret, qpow (coef, mod - 2));
}
printf ("%d\n", H[n]);
return 0;
}
```