不妨先不考慮詢問,求從底層到頂層的方案
設\(dp_\)表示到第i層的j邊的方案數(j=0/1,0代表在左邊,1代表在右邊)
轉移方程為
\(dp_=dp_+[有『\』的樓梯]\cdot dp_\)
\(dp_=dp_+[有『/』的樓梯]\cdot dp_\)
不難寫出乙個矩陣
\[\begin
dp_&dp_\\
\end
*\begin
1&[if \quad '/']\\
[if\quad '\']&1\\
\end
= \begin
dp_&dp_\\
\end
\]因此可見每一層的轉移都是固定的,那麼我們可以用字首和來維護
所以對於每次詢問,只要求得區間的矩陣乘積即可
得到區間的矩陣乘積可以用線段樹維護,也可以直接用矩陣求逆來求,這裡用的是前者
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define pa pairusing namespace std;
const int maxn=2e6+101;
const int mod=1e9+7;
const int inf=2147483647;
const double pi=acos(-1);
int read()
struct matrix
return sum;
}void print()
matrix query(int k,int l,int r,int l,int r)
int main(){
n=read();m=read();char ch[maxn];scanf("%s",ch);
ls[0].a[0][1]=1;ls[1].a[1][0]=1;
for(int i=1;i
牛客 智乃與無意義的題目 K K
思路 要的是因子個數,考慮到給的a i 很小 10 以內的質數只有2 3 5 7 那麼考慮將每乙個數都質因數分解 然後最後總的方案數 2的個數 1 3的個數 1 5的個數 1 7的個數 1 即為總的方案數 1 include2 using namespace std 3 define ll long...