专栏文章

[CEOI 2016] kangaroo 大力推导

P5999题解参与者 14已保存评论 13

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
13 条
当前快照
1 份
快照标识符
@min3tojz
此快照首次捕获于
2025/12/01 20:07
3 个月前
此快照最后确认于
2025/12/01 20:07
3 个月前
查看原文
容斥做法太神秘了,看不懂怎么办?爆推式子一样能做!
不失一般性,我们可以设 s<ts<t。若非如此,直接将二者交换即可。
我们从朴素的递推式做推导:
fi,j={jfi1,j+1+(j[i>s][i>t])fi1,j1 , isitfi1,j+fi1,j1 , otherwisef_{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}
边界值为 f1,1=1f_{1,1}=1,答案为 fn,1f_{n,1}
按行建立生成函数,则在 isiti \neq s \wedge i \neq t 时,递推可以写为
Fi(x)=(1+x2)Fi1(x)+((1[i>s][i>t])x1/x)Fi1(x)F_i(x)=(1+x^2)F_{i-1}'(x)+((1-[i>s]-[i>t])x-1/x)F_{i-1}(x)
使用附加因子法,设 Fi(x)=pi(x)Gi(x)F_i(x)=p_i(x)G_i(x),则当 pi(x)=x(1+x2)([i>s]+[i>t]2)/2p_i(x)=x(1+x^2)^{([i>s]+[i>t]-2)/2} 时,GiG_i 的递推中刚好消去含 Gi1G_{i-1} 项,也就变为:
Gi(x)=(1+x2)Gi1(x)  (isit)G_i(x)=(1+x^2)G_{i-1}'(x) \ \ (i \neq s \wedge i \neq t)
而对于特殊位置的情况,本来是 Fi(x)=(1+x)Fi1(x)F_i(x)=(1+x)F_{i-1}(x),在新的递推式中为
Gi(x)=(1+x)(1+x2)1/2Gi1(x)G_i(x)=(1+x)(1+x^2)^{-1/2}G_{i-1}(x)
显然边界值为 G1(x)=1+x2G_1(x)=1+x^2,答案为 Gn(0)G_n(0)

现在考虑做基变换换元,设 Hi(u)=Gi(x)H_i(u) = G_i(x),则有(isiti \neq s \wedge i \neq t):
Hi(u)=dHi1(u)du=dHi1(u)dxdxduH_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+x2)u'=1/(1+x^2),即 u=arctanxu=\arctan x。那么就能得到 H1(u)=(cosu)2H_1(u)=(\cos u)^{-2},以及递推:
Hi(u)={(sinu+cosu)Hi1(u) , i=si=tdHi1(u)/du , otherwiseH_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}
答案显然还是 Hn(0)H_n(0)

按递推式可以反推出 H0(u)=tanuH_0(u)=\tan u,再设 A=s1,B=ts1,C=ntA=s-1,B=t-s-1,C=n-t
现在也就可以将答案表示为
C![uC](sinu+cosu)(dBduB(sinu+cosu)dA(tanu)duA)C![u^C](\sin u+\cos u)\left(\frac{\text d^B}{\text du^B}(\sin u+\cos u)\frac{\text d^A(\tan u)}{\text d u^A}\right)
现在就得到了一个 Θ(nlogn)\Theta(n \log n) 的做法,要进一步优化,可以考虑:
tanu=ieiueiueiu+eiu=i(u+1)(u+1)1(u+1)+(u+1)1(eiu1)\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)
至于为什么是复合 (eiu1)(\text e^{\text i u}-1) 而不是 eiu\text e^{\text i u},这是为了复合操作对形式幂级数收敛(计算 fgf \circ g 时,要么 ff 是有限项的,要么 gg 的最低非零项至少为 11 次)。
在计算中我们系数保留到 modun{} \bmod u^n 肯定就足够了。可以设
W(u)=i(u+1)(u+1)1(u+1)+(u+1)1modunW(u)= -\text i \frac{(u+1)-(u+1)^{-1}}{(u+1)+(u+1)^{-1}} \bmod u^n
则有 W(eiu1)tanu(modun)W(\text e^{\text iu}-1)\equiv \tan u \pmod{u^n}
现在只需要再设 W^(u)=W(u1)\hat W(u)=W(u-1),就能得到 W^(eiu)tanu(modun)\hat W(\text e^{\text iu})\equiv \tan u \pmod{u^n} 了。而 W^(u)\hat W(u) 是可以用整式递推以 Θ(n)\Theta(n) 的时间复杂度计算的。
这样一来,答案就是
C![uC](sinu+cosu)(dBduB(sinu+cosu)k=0n1w^k(ik)Aeiku)C![u^C](\sin u+\cos u)\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)
sinu\sin ucosu\cos u 的导数都是容易计算的,所以考虑逐项求和:
C!k=0n1w^k(ik)A[uC](sinu+cosu)dBdu(ei(k+1)uei(k1)u2i+ei(k+1)u+ei(k1)u2)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)
=12C!k=0n1w^k(ik)A[uC](sinu+cosu)((k+1)B(1i)ei(k+1)u+(k1)B(1+i)ei(k1)u)iB=\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
=iA+B4C!k=0n1w^kkA[uC]((1i)eiu+(1+i)eiu)((k+1)B(1i)ei(k+1)u+(k1)B(1+i)ei(k1)u)=\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})
=iA+B+C4k=0n1w^kkA((k+1)B(1i)((1i)(k+2)C+(1+i)kC)+(k1)B(1+i)((1i)kC+(1+i)(k2)C))=\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)
配合线性筛,即可做到 Θ(n)\Theta(n) 的时间复杂度。

评论

13 条评论,欢迎与作者交流。

正在加载评论...