bzoj4161 k 2logn求線性遞推式

2022-01-29 08:58:22 字數 1177 閱讀 9639

分析:

我們可以寫把轉移矩陣a寫出來,然後求一下它的特徵多項式,經過手動計算應該是這樣的p(x)=$x^k-\sum\limits_^ka_i*x^$

根據cayley-hamilton定理可得,p(a)=0

他表示$a^n = f(a) * p(a) + g(a)$

第一項的值是0,所以即$a^n=g(a)$,其中f(a) g(a)都是關於a的多項式,f(a)是多項式除法的商,g(a)是餘數

我們考慮$x^n$這個多項式,我們去求出它對於$p(a)$的餘數多項式$g(a)$,那麼$a^n$就等價於了$g(a)$,注意到新的多項式次數就很低了,不超過k-1

我們要求的是$a^nh=\sum\limits_^c_i*a^i*h$的第乙個元素,注意到$a^i*h$相當於把h又遞推了i次

所以結果等價於$a^nh=\sum\limits_^c_i*a^i*h$

時間複雜度$o(k^2 log n)$,但常數很大

中間的多項式取模和遞推可以用fft來優化,但常數更巨大

1 #include2

using

namespace

std;

3const

int maxn=4000,mod=1000000007;4

int a[maxn+5],p[maxn+5],ans[maxn+5],num[maxn+5];5

int h[maxn+5],tmp[maxn+5];6

intn,k;

7void mul(int *a,int *b,int *ans)819

for(int i=0;itmp[i];20}

21int

main()

2234

if(n<2*k) return

0*printf("

%d\n

",h[n]);

35int b=n-k+1

;36 num[1]=1,ans[0]=1;37

while

(b)38

43long

long res=0;44

for(int i=0;i1])%mod;

45 printf("

%lld\n

",(res+mod)%mod);

46return0;

47 }

view code

BZOJ 3110, K大數查詢

傳送門 要求維護乙個數列,支援在某部分的每個位置填上乙個數以及查詢某部分第k大的數字。終於學習了一下樹套樹的姿勢 其實和自己想的也差不多 但是不學還是打不出 來 外層是權值線段樹,內層是區間線段樹。要注意的細節比較多。二分查詢過程中結果可能超過maxlongint,需要用unsigned int型別...

BZOJ 2171 K凹凸序列

題目描述 乙個序列的第1,3,5 項被稱作奇數項,第2,4,6 項被稱作偶數項。乙個序列a 1 n 被稱作zigzag序列當且僅當以下兩個條件中的乙個 或兩個 成立 1 除了首項,所有的奇數項都比它的前項小且所有的偶數項都比它的前項大。2 除了首項,所有的奇數項都比它的前項大且所有的偶數項都比它的前...

BZOJ1073 k短路(A 演算法)

a 演算法,也叫啟發式搜尋,就是設計乙個預估函式,然後在搜尋的過程中進行有序的搜尋,我們設到目前狀態的花費為f x 到目標狀態的估計花費為h x 那麼我們按照h x f x 排序即可,這道題裡起點到目前的距離為f x 目前到終點的最短路為g x 然後進行暴力搜尋即可。by vane includeu...