bzoj 5298 Cqoi2018 交錯序列

2021-08-21 14:57:13 字數 1458 閱讀 2571

我們稱乙個僅由0、1構成的序列為"交錯序列",當且僅當序列中沒有相鄰的1(可以有相鄰的0)。例如,000,001,101,都是交錯序列,而110則不是。對於乙個長度為n的交錯序列,統計其中0和1出現的次數,分別記為x和y。給定引數a、b,定義乙個交錯序列的特徵值為xayb。注意這裡規定任何整數的0次冪都等於1(包括0^0=1)。顯然長度為n的交錯序列可能有多個。我們想要知道,所有長度為n的交錯序列的特徵值的和,除以m的餘數。

今早聽說cqoi今年出得很差,(其實早就聽說了),於是就去看了一下

做了一下這題,感覺思路還算是可以,至少我省選前都不是很會化開二項式,唉。。。

暴力列舉個數+組合數學是很難化下去的

於是我們考慮化另外乙個式子

x ay

b=(n

−y)a

yb=y

b∑(−

1)a−

iniy

a−i=

∑(−1

)a−i

niya

+b−i

x^ay^b=(n-y)^ay^b=y^b\sum(-1)^n^iy^=\sum(-1)^n^iy^

xayb=(

n−y)

ayb=

yb∑(

−1)a

−ini

ya−i

=∑(−

1)a−

iniy

a+b−

i我們只需要求出合法的y

iy^i

yi就好了這個的化可以考慮dp

f [i

][j]

[k

]f[i][j][k]

f[i][j

][k]

表示長度是i

ii,結尾是k

kk,求的是y

jy^j

yj然後討論一下轉移就好了

顯然可以使用矩陣乘法優化

但是有一點要注意,矩乘的時候不要隨便mod,要不會被卡常數。。

因為m不大,最後mod一次就夠了。。

優化這個mod常數可以小很多

code:

#include#include#include#includeusing namespace std;

typedef long long ll;

ll f[105][200];//長度為這個 i次方 結尾是什麼

ll c[105][105];

ll n,a,b,mod;

struct qq

;qq operator * (qq x,qq y)

return c;

}qq pow (qq x,ll y)

return lalal;

}int main()

if (ans<0) ans=ans+mod;

printf("%lld\n",ans);

return 0;

}

bzoj1257 CQOI 餘數之和

題目 time limit 5 sec memory limit 162 mb submit 2383 solved 1105 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除...

BZOJ1818 Cqoi2010 內部白點

給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...

bzoj3295 CQOI2011 動態逆序對

time limit 10 sec memory limit 128 mb submit 3122 solved 986 submit status discuss 對於序列a,它的逆序對數定義為滿足i aj 的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次...