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