校內模擬 長壽花(組合數學DP)

2021-09-29 09:45:47 字數 1783 閱讀 5903

簡要題意:

有 n

nn 層架子,第i

ii層上有a

ia_i

ai​個位置,一共有m

mm種可用顏色,你需要給所有位置染色並滿足下列限制:

同層相鄰位置不染同色

相鄰兩層的所用顏色集合,在去重之後不相等。

問你有多少種方案。

模數任意

其實這道題讓人考場上不太想做的唯一原因就是模數任意。 設coe

f[i]

[j

]coef[i][j]

coef[i

][j]

表示用j

jj個顏色給i

ii個位置染色,且顏色按照最小表示排列,的方案數。

轉移方程很顯然,不寫了,coe

fcoef

coef

也可以直接dp處理,不講了。

注意到最後的轉移裡面有乙個(mj

)(j

m​),把j!j!

j!拿出來,發現外面也有乙個j!j!

j!,然後預處理m

mm的下降冪就可以做了。

**:

#include

#define ll long long

#define re register

#define cs const

namespace io

template

<

typename t>t get()

inline

intgi()

}using

namespace io;

using std::cerr;

using std::cout;

typedef std::pair<

int,

int> pii;

#define fi first

#define se second

int p,n,m;

inline

intadd

(int a,

int b)

inline

intdec

(int a,

int b)

inline

intmul

(int a,

int b)

inline

intpo

(int a,

int b)

inline

void

inc(

int&a,

int b)

inline

void

dec(

int&a,

int b)

inline

void

mul(

int&a,

int b)

cs int n=

5e3+7;

int coef[n]

[n],dn[n]

,fac[n]

;int af[n]

,ag[n]

,*f=af,

*g=ag,lst;

void

init()

signed

main()

lst=now;

}int ans=0;

for(

int re i=

0;i<=lst;

++i)

inc(ans,f[i]);

cout<"\n"

;return0;

}

NOI模擬 長壽花 dp 組合數學

傳送門 題意 有n層,每層a i 個位置,m個顏色。每個位置可以選擇乙個顏色。要求相鄰顏色不相同,相鄰兩層顏色集合不完全相同。求方案數。發現a i 最大5000,直接n方預處理。根據套路設 列舉第i位是否啟用新顏色得到 然後再來考慮很多層。設如果不管相鄰限制,然而相鄰不能完全相同。那就直接減去 所以...

合法括號序列(dp 組合數學)

鍵盤上有左括號 右括號 和退格鍵 共三個鍵。牛牛希望按鍵n次,使得輸入的字串恰好乙個合法的括號序列。每按一次左括號 字串末尾追加乙個左括號 每按一次右括號 字串末尾追加乙個右括號 每按一次退格鍵 會刪掉字串的最後乙個字元,特別的,如果字串為空,牛牛也可以按退格,但是什麼都不會發生。輸出方案數對p取模...

NOIP模擬 排隊(組合數學)

在成都某中學有m個男生與n個女生排隊,這個學校的女生比較古怪,從某個位置 包含這個位置 開始往前數,男生的數量超過了女生的數量,女生會感覺不安全,於是會大叫起來,為了構建和諧校園,安排隊伍時應該避免這樣的情況。請你計算出不會引發尖叫的排隊方案的概率。排隊方案不同定義 當且僅當某個某個位置人不一樣,如...