高階操作 常係數線性遞推式

2022-05-22 20:15:13 字數 1657 閱讀 4670

對乙個常係數線性遞推式$$f_n = \sum_^k a_i \times f_$$

矩陣快速冪需要 $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.倍增的全過程

嗯...不是很長?

附乙個拉格朗日插值的**吧

給乙個長度為 $n$ 的多項式函式(注意,是長度,所以次數為 $n-1$),求它在 k 處的點值

#include#define ll long long 

using

namespace

std;

inline

intread()

inline

void write(int

x)const

int maxn = 2010,mod = 998244353

;int

n,k,x[maxn],y[maxn];

inline

int skr(int x,int

t)return

res;

}int

main()

}ans = ((ll)ans + (ll)y[i] * t1 % mod * skr(t2,mod - 2) % mod) %mod;

}ans = ((ans % mod) + mod) %mod;

cout

<

}

view code

常係數齊次線性遞推

給定遞推式 f n a 1f a 2 f a k f 給定 f 0,f 1.f k 求 f n 先定義 f n 的特徵方程 c x x a 1 x a 2 x a x a k 由基本代數定理,c x 0 的解 稱為特徵根 有 k 個,設為 alpha 1 alpha 2.alpha k 有 f n ...

常係數齊次線性遞推

見洛谷模板題。有個數列 給出前 k 項,即 a 0,a 1,dots,a 對於後面的所有 a n 有 a n sum f ia f 給出。小學生 直接幹。初中生 矩陣乘法。現在設 a 為轉移矩陣。列向量 vec v a a dots,a 0 滿足 a vec v a a dots,a 1 我們要求 ...

模板 常係數齊次線性遞推

題目傳送門 給出 k,a f 存在 forall n k wedge n in mathbb,exists a n sum f ka 給出 n 求出 a n n le 10 9,k le 32000 以下部分借鑑了 bjpers2 的題解 恭喜您!您獲得了 theta k 3 log n 的時間複雜...