JZOJ 雜題選講 友誼

2021-10-03 19:06:01 字數 1319 閱讀 6223

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 思路分步 填數 問題符合乘法原理,考慮從大到小填數,先...