容斥做法太神秘了,看不懂怎么办?爆推式子一样能做!
不失一般性,我们可以设
s<t。若非如此,直接将二者交换即可。
我们从朴素的递推式做推导:
fi,j={jfi−1,j+1+(j−[i>s]−[i>t])fi−1,j−1 , i=s∧i=tfi−1,j+fi−1,j−1 , otherwise
边界值为
f1,1=1,答案为
fn,1。
按行建立生成函数,则在
i=s∧i=t 时,递推可以写为
Fi(x)=(1+x2)Fi−1′(x)+((1−[i>s]−[i>t])x−1/x)Fi−1(x)
使用附加因子法,设
Fi(x)=pi(x)Gi(x),则当
pi(x)=x(1+x2)([i>s]+[i>t]−2)/2 时,
Gi 的递推中刚好消去含
Gi−1 项,也就变为:
Gi(x)=(1+x2)Gi−1′(x) (i=s∧i=t)
而对于特殊位置的情况,本来是
Fi(x)=(1+x)Fi−1(x),在新的递推式中为
Gi(x)=(1+x)(1+x2)−1/2Gi−1(x)
显然边界值为
G1(x)=1+x2,答案为
Gn(0)。
现在考虑做基变换换元,设
Hi(u)=Gi(x),则有(
i=s∧i=t):
Hi(u)=dudHi−1(u)=dxdHi−1(u)dudx
不难看出现在得到微分方程
u′=1/(1+x2),即
u=arctanx。那么就能得到
H1(u)=(cosu)−2,以及递推:
Hi(u)={(sinu+cosu)Hi−1(u) , i=s∨i=tdHi−1(u)/du , otherwise
答案显然还是
Hn(0)。
按递推式可以反推出
H0(u)=tanu,再设
A=s−1,B=t−s−1,C=n−t。
现在也就可以将答案表示为
C(duBdB(sinu+cosu)duAdA(tanu))
现在就得到了一个
Θ(nlogn) 的做法,要进一步优化,可以考虑:
tanu=−ieiu+e−iueiu−e−iu=−i(u+1)+(u+1)−1(u+1)−(u+1)−1∘(eiu−1)
至于为什么是复合
(eiu−1) 而不是
eiu,这是为了复合操作对形式幂级数收敛(计算
f∘g 时,要么
f 是有限项的,要么
g 的最低非零项至少为
1 次)。
在计算中我们系数保留到
modun 肯定就足够了。可以设
W(u)=−i(u+1)+(u+1)−1(u+1)−(u+1)−1modun
则有
W(eiu−1)≡tanu(modun)。
现在只需要再设
W^(u)=W(u−1),就能得到
W^(eiu)≡tanu(modun) 了。而
W^(u) 是可以用整式递推以
Θ(n) 的时间复杂度计算的。
这样一来,答案就是
C(duBdB(sinu+cosu)∑k=0n−1w^k(ik)Aeiku)
sinu 和
cosu 的导数都是容易计算的,所以考虑逐项求和:
C!∑k=0n−1w^k(ik)A[uC](sinu+cosu)dudB(2iei(k+1)u−ei(k−1)u+2ei(k+1)u+ei(k−1)u)
=21C!∑k=0n−1w^k(ik)A[uC](sinu+cosu)((k+1)B(1−i)ei(k+1)u+(k−1)B(1+i)ei(k−1)u)iB
=4iA+BC!∑k=0n−1w^kkA[uC]((1−i)eiu+(1+i)e−iu)((k+1)B(1−i)ei(k+1)u+(k−1)B(1+i)ei(k−1)u)
=4iA+B+C∑k=0n−1w^kkA((k+1)B(1−i)((1−i)(k+2)C+(1+i)kC)+(k−1)B(1+i)((1−i)kC+(1+i)(k−2)C))
配合线性筛,即可做到
Θ(n) 的时间复杂度。