[高端操作]常系數線性遞推式
對一個常系數線性遞推式$$f_n = \sum_{i=1}^k a_i \times f_{n-i}$$
矩陣快速冪需要 $O(k^3logn)$ ?
這篇文章將教您在至多為 $O(k^2logn + k^4)$ 時間內搞這個式子
有什麽用嘛,可能對我這種省選註定退役的人沒啥用,但對於 NOI 及以上比賽想 AK 的同學們可能有用
1.矩陣的特征多項式
矩陣 $A$ 的特征多項式是一個關於 $\lambda$ 的函數 $f(\lambda)=det(\lambda I - A)$,其中 $I$ 為單位矩陣,$det()$ 為行列式
2.Caylay-Hamilton 定理
就一句話,$f(A) = 0$,證明略
3.求矩陣特征多項式的方法
1) 消一消
考慮根據定義,需要求行列式,消一下就可以了,復雜度 $O(k^5)$ 或 $O(k^4)$
2)插一插
考慮到特征多項式是一個 $k$ 次的多項式,我們可以把 $\lambda = 0,1,2, \cdots ,k$ 時的點值求出來,然後拉格朗日插值,復雜度 $O(k^4)$
4.有啥用
根據小學知識
$$被除數 ÷ 除數 = 商 \cdots \cdots 余數$$
我們發現,一個次數大於等於 $k$ 的矩陣冪,可以把它除以 $f(A)$
之後我們發現:因為除數等於 $0$ ,所以$余數 = 被除數$
然後我們發現,余數的次數不超過 $k$
於是我們可以用類似快速冪的做法倍增,把 $n$ 次的矩陣冪變成一個不超過 $k$ 次的多項式
其中每一步如果用快速的多項式取模 (FFT) ,是 $O(klogk)$ 的,如果暴力,是 $O(k^2)$ 的
這一步的復雜度是 $O(klogklogn)$ 或者 $O(k^2logn)$
然後就做完了。。。看上去很簡單,但我們可以數數,一道完整的題,您要寫多少代碼
1.多項式相關操作(FFT,求逆,取膜)
2.構造矩陣(dfs / 根據題目情況而定)
3.構造特征多項式(消元 / 拉格朗日插值)
4.倍增的單步轉移
5.倍增的全過程
嗯...不是很長?
[高端操作]常系數線性遞推式