分析:
我們可以寫把轉移矩陣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 #include2view codeusing
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 }
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...