[CEOI 2016] kangaroo 大力推导
NaCly_Fish
·
2025-11-21 04:31:53
·
题解
容斥做法太神秘了,看不懂怎么办?爆推式子一样能做!
不失一般性,我们可以设 s<t 。若非如此,直接将二者交换即可。
我们从朴素的递推式做推导:
f_{i,j}=\begin{cases} j f_{i-1,j+1}+(j-[i>s]-[i>t])f_{i-1,j-1} \ , \ i \neq s \wedge i \neq t \\ f_{i-1,j}+f_{i-1,j-1} \ , \ \text{otherwise}\end{cases}
边界值为 f_{1,1}=1 ,答案为 f_{n,1} 。
按行建立生成函数,则在 i \neq s \wedge i \neq t 时,递推可以写为
F_i(x)=(1+x^2)F_{i-1}'(x)+((1-[i>s]-[i>t])x-1/x)F_{i-1}(x)
使用附加因子法,设 F_i(x)=p_i(x)G_i(x) ,则当 p_i(x)=x(1+x^2)^{([i>s]+[i>t]-2)/2} 时,G_i 的递推中刚好消去含 G_{i-1} 项,也就变为:
G_i(x)=(1+x^2)G_{i-1}'(x) \ \ (i \neq s \wedge i \neq t)
而对于特殊位置的情况,本来是 F_i(x)=(1+x)F_{i-1}(x) ,在新的递推式中为
G_i(x)=(1+x)(1+x^2)^{-1/2}G_{i-1}(x)
显然边界值为 G_1(x)=1+x^2 ,答案为 G_n(0) 。
现在考虑做基变换换元,设 H_i(u) = G_i(x) ,则有(i \neq s \wedge i \neq t ):
H_i(u)=\frac{\text d H_{i-1}(u)}{\text du}=\frac{\text d H_{i-1}(u)}{\text dx} \frac{\text dx}{\text du}
不难看出现在得到微分方程 u'=1/(1+x^2) ,即 u=\arctan x 。那么就能得到 H_1(u)=(\cos u)^{-2} ,以及递推:
H_i(u) = \begin{cases} (\sin u +\cos u)H_{i-1}(u) \ , \ i = s \vee i = t \\ \text d H_{i-1}(u)/\text du \ , \ \text{otherwise}\end{cases}
答案显然还是 H_n(0) 。
按递推式可以反推出 H_0(u)=\tan u ,再设 A=s-1,B=t-s-1,C=n-t 。
现在也就可以将答案表示为
C\left(\frac{\text d^B}{\text du^B}(\sin u+\cos u)\frac{\text d^A(\tan u)}{\text d u^A}\right)
现在就得到了一个 \Theta(n \log n) 的做法,要进一步优化,可以考虑:
\tan u=-\text i\frac{\text e^{\text i u}-\text e^{-\text i u}}{\text e^{\text i u}+\text e^{-\text i u}}=-\text i \frac{(u+1)-(u+1)^{-1}}{(u+1)+(u+1)^{-1}}\circ (\text e^{\text i u}-1)
至于为什么是复合 (\text e^{\text i u}-1) 而不是 \text e^{\text i u} ,这是为了复合操作对形式幂级数收敛(计算 f \circ g 时,要么 f 是有限项的,要么 g 的最低非零项至少为 1 次)。
在计算中我们系数保留到 {} \bmod u^n 肯定就足够了。可以设
W(u)= -\text i \frac{(u+1)-(u+1)^{-1}}{(u+1)+(u+1)^{-1}} \bmod u^n
则有 W(\text e^{\text iu}-1)\equiv \tan u \pmod{u^n} 。
现在只需要再设 \hat W(u)=W(u-1) ,就能得到 \hat W(\text e^{\text iu})\equiv \tan u \pmod{u^n} 了。而 \hat W(u) 是可以用整式递推以 \Theta(n) 的时间复杂度计算的。
这样一来,答案就是
C\left(\frac{\text d^B}{\text du^B}(\sin u+\cos u) \sum_{k=0}^{n-1} \hat w_k (\text i k)^A \text e^{\text i k u}\right)
$$C!\sum_{k=0}^{n-1} \hat w_k( \text i k)^A[u^C](\sin u+\cos u)\frac{\text d^B}{\text du}\left( \frac{\text e^{\text i(k+1)u}-\text e^{\text i (k-1)u}}{2\text i}+\frac{\text e^{\text i (k+1)u}+\text e^{\text i (k-1)u}}{2}\right)$$
$$=\frac 12C!\sum_{k=0}^{n-1} \hat w_k( \text i k)^A[u^C](\sin u+\cos u)((k+1)^B(1-\text i)\text e^{\text i (k+1)u}+(k-1)^B (1+\text i)\text e^{\text i (k-1)u})\text i^B$$
$$=\frac{\text i^{A+B}}{4}C!\sum_{k=0}^{n-1} \hat w_k k^A [u^C] ((1-\text i)\text e^{\text i u}+(1+\text i)\text e^{-\text i u})((k+1)^B(1-\text i)\text e^{\text i (k+1)u}+(k-1)^B (1+\text i)\text e^{\text i (k-1)u})$$
$$=\frac{\text i^{A+B+C}}{4}\sum_{k=0}^{n-1} \hat w_k k^A\left((k+1)^B(1-\text i)((1-\text i) (k+2)^C+(1+\text i)k^C) +(k-1)^B(1+\text i)((1-\text i) k^C+(1+\text i)(k-2)^C)\right)$$
配合线性筛,即可做到 $\Theta(n)$ 的时间复杂度。