description
flowey 是一朵能夠通過友誼顆粒傳播love 的小花.它的友誼顆粒分為兩種,
圓粒的和皺粒的,它們依次排列組成了乙個長度為2m 的序列.對於乙個友誼顆
粒的序列,如果存在1<=iinput
從friend.in 讀入資料
為一行三個正整數,n,m,p
output
輸出到friend.out 中
為一行乙個非負整數,代表答案對p 取模的結果
sample input
輸入1:
2 3 233
輸入2:
223 514 514223
輸入3:
50 25 514223
sample output
輸出1:
56輸出2:
488817
輸出3:
140210
data constraint
對於30%的資料,滿足n<=10,m<=10
對於60%的資料,滿足n<=300,m<=300
對於100%的資料,滿足1<=n<=3000,1<=m<=3000,2<=p<=1000000007
考慮暴力,設f[i][j][k]為前i組,剩j個0,k個1
假設一開始我們有n個可匹配的偶數字置(可0可1),我們會發現我們轉移過程中可供匹配的位置數量恒為n
那麼修改一下狀態,f[i][j]表示前i組有j個0,那麼就有n-j個1
但是這樣會算重,乙個合法方案可能有很多種分配n個可匹配的位置的01的方案
注意到一定有一種方案滿足某個時刻可匹配的位置用完了
再加一維0/1表示轉移過程中是否經過j=0
#include
#define ll long long
using
namespace std;
int n,m,p;
ll f[
3100][
3100][
2];int
main()
f[i]
[j][0]
%=p;f[i]
[j][1]
%=p;
} f[i][0
][0]
=0;}
ll ans=0;
for(
int i=
0;i<=n;i++
) ans=
(ans+f[m]
[i][1]
)%p;
printf
("%lld"
,ans)
;return0;
}
JZOJ 雜題選講 Bitset Master
換個問題,求每個集合最後的大小。我們發現,如果將 u,v 合併,那麼 f u f v f u f v f u f v 而 f u f v 之和上一次 u,v 合併的結果有關,於是我們可以對每條邊單獨記錄乙個數,表示上一次合併這條邊的結果 回到原問題,我們發現,每個點被哪些集合包含,只需要倒敘處理新問...
JZOJ 雜題選講 51nod1790
有乙個初始為0的計數器n,每次有兩種操作 n 1 把n不含前導0的二進位制接到字串s的末尾 目標是把s變成給出的字串x 求方案數和最小步數 x 5000 設f i j 表示放到x的第i位,n為 j,i 的方案,最小值同理 每次列舉上乙個位置轉移,這樣是o x 3 並且不好判斷二進位制數的大小 按x的...
2019 2 28 雜題選講
考慮將1至n m分別填入乙個擁有n行m列的 中,不允許重複。你需要滿足以下要求 第i行 1 i n 的最大值為ai。第j列 1 j m 的最大值為bj。請求出合法的填數方案數在模109 7意義下的值。1 n,m 1000 1 ai,bj n m 思路分步 填數 問題符合乘法原理,考慮從大到小填數,先...