P15305 『NFC-OI R1』序列贰
这是一个时间复杂度 \(O(T\log n)\) 的做法。
基础做法
令 \(f_{i,j,k,l}\) 表示前 \(i\) 位中,第 \(i\) 位是否填,第 \(i-1\) 位是否填,有几个孤立元,其中 \(j,k,l\in\{0,1\}\)。此处认为第 \(i\) 位有数,第 \(i-1\) 位没数时暂时不算孤立元。
对于孤立元数量不变的情况,
\[f_{i,0,0,j}\leftarrow f_{i-1,0,0,j}+f_{i-1,0,1,j}
\]
\[f_{i,0,1,j}\leftarrow f_{i-1,1,1,j}
\]
\[f_{i,1,0,j}\leftarrow f_{i-1,0,0,j}+f_{i-1,0,1,j}
\]
\[f_{i,1,1,j}\leftarrow f_{i-1,1,0,j}+f_{i-1,1,1,j}
\]
其中 \(j\in\{0,1\}\)。
对于孤立元增加一个的情况,
\[f_{i,0,1,1}\leftarrow f_{i-1,1,0,0}
\]
递推时的初始条件为:
\[f_{0,0,0,0}=1
\]
对于每个询问 \(n\),答案为
\[f_{n,0,0,1}+f_{n,0,1,1}+f_{n,1,0,0}+f_{n,1,1,1}
\]
时间复杂度 \(O(T+n)\)。
以下是清晰完整的式子(等号而非贡献形式):
\[f_{i,0,0,0}=f_{i-1,0,0,0}+f_{i-1,0,1,0}
\]
\[f_{i,0,0,1}=f_{i-1,0,0,1}+f_{i-1,0,1,1}
\]
\[f_{i,0,1,0}=f_{i-1,1,1,0}
\]
\[f_{i,0,1,1}=f_{i-1,1,0,0}+f_{i-1,1,1,1}
\]
\[f_{i,1,0,0}=f_{i-1,0,0,0}+f_{i-1,0,1,0}
\]
\[f_{i,1,0,1}=f_{i-1,0,0,1}+f_{i-1,0,1,1}
\]
\[f_{i,1,1,0}=f_{i-1,1,0,0}+f_{i-1,1,1,0}
\]
\[f_{i,1,1,1}=f_{i-1,1,0,1}+f_{i-1,1,1,1}
\]
矩阵快速幂做法
容易发现当 \(i\geq 1\) 时,\(f_{i,0,0,0}=f_{i,1,0,0}\),\(f_{i,0,0,1}=f_{i,1,0,1}\)。因此,令
\[h_{i,0}=f_{i,0,0,0}
\]
\[h_{i,1}=f_{i,0,0,1}
\]
\[h_{i,2}=f_{i,0,1,0}
\]
\[h_{i,3}=f_{i,0,1,1}
\]
\[h_{i,4}=f_{i,1,1,0}
\]
\[h_{i,5}=f_{i,1,1,1}
\]
可得
\[h_{i,0}=h_{i-1,0}+h_{i-1,2}
\]
\[h_{i,1}=h_{i-1,1}+h_{i-1,3}
\]
\[h_{i,2}=h_{i-1,4}
\]
\[h_{i,3}=h_{i-1,0}+h_{i-1,5}
\]
\[h_{i,4}=h_{i-1,0}+h_{i-1,4}
\]
\[h_{i,5}=h_{i-1,1}+h_{i-1,5}
\]
初始情况为 \(h_0=1\)。
答案为 \(h_{n,0}+h_{n,1}+h_{n,3}+h_{n,5}\)。
令
\[\mathbf{V}_i=
\begin{pmatrix}
h_{i,0} \\
h_{i,1} \\
h_{i,2} \\
h_{i,3} \\
h_{i,4} \\
h_{i,5}
\end{pmatrix}
\]
则
\[\mathbf{V}_1=
\begin{pmatrix}
1 \\
0 \\
0 \\
0 \\
0 \\
0
\end{pmatrix}
\]
设转移矩阵 \(\mathbf{M}\) 满足 \(\mathbf{M}\mathbf{V}_i=\mathbf{V}_{i+1}\),则
\[\mathbf{M}=
\begin{pmatrix}
1 & 0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 \\
1 & 0 & 0 & 0 & 0 & 1 \\
1 & 0 & 0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 & 0 & 1
\end{pmatrix}
\]
则 \(\mathbf{V}_n=\mathbf{M}^{n-1}\mathbf{V}_1\)。
读取对应行得到 \(h_{n,0},\,h_{n,1},\,h_{n,3},\,h_{n,5}\) 并累加即可得到答案。
使用矩阵快速幂可以以 \(O(T\log n)\) 的时间复杂度解决这个问题。
tips:因为当 \(i=0\) 时,\(f_{i,0,0,0}=f_{i,1,0,0}\) 不成立,所以它不满足转移,自然不满足矩阵转移,所以矩阵快速幂必须从 \(i=1\) 开始。通过计算可以得出 \(\mathbf{V}_1\)。