推式子
前言:做了 \(6\) 個小時,但是全程自己推式子,寫程式,值得寫一篇文章紀念。
不難發現:
\[ans2=\dfrac1{r-l+1}\sum_{n=l}^r{fib_n\choose k}\\
ans3=\dfrac1{r-l+1}\sum_{n=l}^r{g_n\choose k}\\
其中g_n=\left\{\begin{aligned}
&0&&2\not|n\\
&3g_{n-2}+2\sum_{i=1}^{\frac n2-2}g_i=4g_{n-2}-g_{n-4}&&2|n
\end{aligned}\right.
\]
發現對於 \(ans2,ans3\) 的計算都是因為 $[l,r] $ 的範圍太大了,於是考慮推式子,改變迴圈變數。
前置知識:
\[m^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}m^{\underline i}
\]
根據斯特林反演,有:
\[m^{\underline n}=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}m^i
\]
這是在普通冪與下降冪之間轉換的好手。
考慮 \(ans2\)
\[\def\s#1#2{\begin{bmatrix}#1\\#2\end{bmatrix}}
\begin{aligned}
ans2&=\dfrac1{r-l+1}\sum_{n=l}^r{fib_n\choose k}\\
&=\dfrac1{(r-l+1)k!}\sum_{n=l}^rfib_n^{\underline k}\\
&=\dfrac1{(r-l+1)k!}\sum_{n=l}^r\sum_{i=0}^k(-1)^{k-i}\s kifib_n^i\\
記res2&=(r-l+1)k!,A=\frac{1+\sqrt 5}2,B=\frac{1-\sqrt 5}2\\
\because fib_n&=\frac1{\sqrt 5}(A^{n+1}-B^{n+1})\\
\therefore res2&=\sum_{n=l}^r\sum_{i=0}^k(-1)^{k-i}\s ki5^{-\frac i2}(A^{n+1}-B^{n+1})^i\\
&=\sum_{i=0}^k(-1)^{k-i}\s ki5^{-\frac i2}\sum_{j=0}^i{i\choose j}(-1)^j\sum_{n=l}^r(A^{i-j}B^j)^{n+1}\\
令 t&=A^{i-j}B^j\\
res2&=\sum_{i=0}^k(-1)^{k-i}\s ki5^{-\frac i2}\sum_{j=0}^i{i\choose j}(-1)^j\frac{t^{r+2}-t^{l+1}}{t-1}\\
\end{aligned}
\]
注意最後特判 \(t=1\)。於是 \(\mathcal O(k^2\log r)\) 可做,但這裡出現了 \(\sqrt5\),在模 \(998244353\) 的意義下不存在。不過我們知道最終結果是一個整數。於是可以新定義複數,使用 \(a+bi,i=\sqrt 5\) 的形式表示,其運算與複數運算類似。
考慮 \(ans3\)
如果要使用與上述類似的方法,首先肯定要找到 \(g_n\) 的通項。這裡我使用了生成函式的方法。這裡令 \(g_i\) 表示原先的 \(g_{2i}\) 方便表示。
令 \(G(x)=\sum_{i}g_ix^i\),有:
\[\begin{aligned}
G(x)&=\sum_{i=2}^{\infin}(4g_{i-1}-g_{i-2})x^i+1+3x\\
&=4x\sum_ig_ix^i-x^2\sum_ig_ix^i+1-x\\
&=4xG(x)-x^2G(x)+1-x\\
\therefore G(x)&=\frac{1-x}{x^2-4x+1}\\
&=\frac{\frac{\sqrt3-1}{2\sqrt3}}{1-(2-\sqrt3)x}+\frac{\frac{\sqrt3+1}{2\sqrt3}}{1-(2+\sqrt3)x}\\
&=\sum_i(\frac{\sqrt3-1}{2\sqrt3}(2-\sqrt3)^i+\frac{\sqrt3+1}{2\sqrt3}(2+\sqrt3)^i)x^i
\end{aligned}
\]
所以 \(g_n=\frac{\sqrt3-1}{2\sqrt3}(2-\sqrt3)^n+\frac{\sqrt3+1}{2\sqrt3}(2+\sqrt3)^n\)
令 \(x=\frac{\sqrt3-1}{2\sqrt3},y=\frac{\sqrt3+1}{2\sqrt3},A=(2-\sqrt3),B=(2+\sqrt3)\)
\(g_n=xA^n+yB^n\),於是可以使用類似的方法做出這道題。
總複雜度:\(\mathcal O(k^2\log r)\)。
啟示:
新定義複數
推式子的本質:改變迴圈變數