我們稱乙個僅由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個元素,你的任務是在每次...