1. 程式人生 > >[高端操作]常系數線性遞推式

[高端操作]常系數線性遞推式

() 知識 bsp 矩陣 sum 超過 求逆 方法 註定

對一個常系數線性遞推式$$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.倍增的全過程

嗯...不是很長?

[高端操作]常系數線性遞推式