這個題簡直有毒,\(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...