CQOI2018 交錯序列

2022-03-27 06:53:24 字數 1101 閱讀 4565

這個題簡直有毒,\(o((a+b)^3logn)\)的做法不卡常只比\(o(2^n*n)\)多\(10\)分

看到\(a\)和\(b\)簡直小的可憐,於是可以往矩陣上聯想

發現這個柿子有些特殊,好像可以二項式定理搞一搞

於是\(x^ay^b\)可以寫成\((n-y)^ay^b\)

於是接下來就二項式定理好了

\[(n-y)^ay^b=\sum_^a\binomn^*(-y)^r*y^b

\]\[=\sum_^a\binomn^*(-1)^r*y^

\]發現好像可以用矩陣來維護這個\(\sum\)的每一項

先列一下\(dp\)的方程,設\(dp[i][j][0/1]\)表示進行到第\(i\)位上,這個\(\sum\)的第\(j\)次方項,最後一位填的是\(0/1\)

如果這一位填\(0\),對答案並沒有什麼貢獻,但是前面填\(0/1\)都是可以的,於是\(dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]\)

如果這一位填的是\(1\),那麼前面的那一位只能填\(0\),\(y\)增加了\(1\),所以答案變成了\((y+1)^j\)

還是用二項式定理

\[(y+1)^j=\sum_^j\binomy^k

\]所以也就可以得到

\[dp[i][j][1]=\sum_^j\binom*dp[i-1][k][0]

\]矩陣維護就可以了

#include#include#include#define re register

#define maxn 185

#define ll long long

ll a[maxn][maxn],ans[maxn][maxn];

int sz;

int t,a,b,p;

ll c[maxn][maxn];

inline void did_a()

}inline void did_ans()

}inline ll quick(ll a,int b)

return s;

}inline void mat_quick(int b)

}int main()

CQOI2018 交錯序列 (矩陣快速冪,數論)

這一題出得真的很好,將原本一道矩陣快速冪硬生生加入組合數的標籤,還那麼沒有違和感,那麼讓人看不出來。所以做這道題必須先知道 矩陣快速冪及如何構建遞推矩陣 組合數及二項式定理 不知道大家有沒有做過洛谷的帕秋莉手環及p哥的桶,這道題中不能有相鄰的兩個1就是我們在構造這個交錯序列時不能連續加入兩個1,這個...

CQOI2018 異或序列

哈哈哈我竟然秒切了省選題 莫隊 異或。考慮異或的性質,乙個數同時異或兩次等於沒有進行操作。那麼我們設a i 為前i個數的異或和,顯然對於乙個區間 l,now a l 1 oplus a now 就是這個區間裡面所有的數的異或和。如果 a l 1 oplus a now k 那麼ans 這等同於 a ...

CQOI 2018 異或序列

給出乙個長為 n 的數列 a 和 k 多次詢問 對於乙個區間 l i,r i 問區間內有多少個不為空的子段異或和為 k 注意到一件有趣的事,就是每次詢問的 k 相同。因為 a oplus a 0 所以子段異或問題可以看作字首異或和的異或,即 a i oplus a i 1 oplus.oplus a...