點此看題面
假設\(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()