前言
传送门 :
E. White and Black Balls
t
a
g
:
tag :
tag:基础课原题
组合记数
画图分析
卡特兰数
题意 :
给定
n
n
n个白球,
m
m
m个黑球,询问有多少种合法放置
条件 :
对于所有的
i
i
i满足
c
n
t
w
i
<
=
c
n
t
b
i
+
K
cnt_{wi}<=cnt_{b_i}+K
cntwi<=cntbi+K
思路 :
显然这题是 AcWing 889. 满足条件的01序列 基础课的变式
但是分析方式不变,图(不是我的,没带笔
因此从
(
0
,
0
)
−
>
(
n
,
m
)
的
路
径
数
(0,0) ->(n,m)的路径数
(0,0)−>(n,m)的路径数 也就是从
(
0
,
0
)
−
>
(
n
+
k
+
1
,
m
−
k
−
1
)
(0,0) ->(n+k+1,m-k-1)
(0,0)−>(n+k+1,m−k−1)的路径数
即答案就是 C n + m n − C n + m m − k − 1 C_{n+m}^n -C_{n+m}^{m-k-1} Cn+mn−Cn+mm−k−1
Code
int fact[N],infact[N];
int qmi(int a,int b){
int res = 1;
while(b){
if(b&1) res = (ll)res*a%mod;
a = (ll) a*a%mod;
b>>=1;
}
return res;
}
void init() {
fact[0] = infact[0] = 1;
for (int i = 1; i < N; i++) {
fact[i] = (ll)fact[i - 1] * i % mod;
infact[i] = (ll)infact[i - 1] * qmi(i, mod - 2) % mod;
}
}
void solve()
{
init();
int n,m,k;
cin>>n>>m>>k;
if(n > k + m){
cout<<0<<endl;
return ;
}
ll a = 0, b = 0;
a = (ll)fact[n + m] * infact[n] % mod * infact[m] % mod;
b = (ll)fact[n + m] * infact[n - k - 1] % mod * infact[m + k + 1] % mod;
cout<<(a-b+mod)%mod<<endl;
}