對乙個常係數線性遞推式$$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 longview codeusing
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
<
}
常係數齊次線性遞推
給定遞推式 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 的時間複雜...