CF575A Fibonotci(矩乘套路題)

2022-05-14 13:41:54 字數 1056 閱讀 4198

點此看題面

假設\(m=0\),則第\(i\)個位置的轉移矩陣就是:

\[\begin

0&s_\\

1&s_

\end

\]那麼就是要求第\(2\sim k\)個矩陣的總乘積,顯然發現它的週期為\(n\),這種東西隨便做做就好了,相信大家都會,畢竟並不是此題的核心所在。

考慮乙個給定的\(s_i\)影響到的是\(s_\)和\(s_\),因此我們可以找出\(2m\)個關鍵點。

兩個關鍵點之間的轉移可以按照上面的方式搞,而關鍵點直接特殊造一下矩陣就好了。

這裡可能會涉及求出一段區間矩陣的乘積,講道理矩陣的乘積應該是不能用字首積差分得到的,想想反正已經有乙個\(log\)了,乾脆寫個線段樹求一下矩陣區間乘積就好了。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 50000

#define ll long long

#define s(x) (u.count(x)?u[x]:s[(x)%n])//求出實際的s[x],也就是判斷其是否為m個特殊點之一

using namespace std;

int n,m,x,s[n+5];ll k,q[2*n+5];mapu;

struct m

i int* operator (ci x) i con int* operator (ci x) con

i m operator * (con m& o) con//矩陣乘法

i m operator ^ (ll y) con//矩陣快速冪 };

class segmenttree

i m q(ci l,ci r,pt)//求矩陣區間乘積

}s;int main()