233
题目:题意:分析:代码:
题目:
传送门
题意:
给出一堆有颜色的珠子,求满足色号为
k
k
k的珠子的最后一个颗要在色号为
k
k
k的珠子的最后一颗的后面的方案数
分析:
对于一个长度为
l
e
n
len
len的已经拍好的珠子序列,新颜色的珠子必定有一个得放在最后,设新来的珠子有
b
b
b颗,那么可以进行排序的就有
b
−
1
b-1
b−1颗,而可以排的位置为队首以及其他珠子的后面,即
l
e
n
+
1
len+1
len+1个位置 因为每个位置可以放若干个,所以联想到了有
n
n
n个球,放入
m
m
m个箱子中,箱子可为空的解法:
C
m
+
n
−
1
m
C_{m+n-1}^m
Cm+n−1m 将
l
e
n
+
1
len+1
len+1、
b
−
1
b-1
b−1带入即可
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define LL long long
#define LZX 998244353
inline LL
read() {
LL d
=0,f
=1;char s
=getchar();
while(s
<'0'||s
>'9'){if(s
=='-')f
=-1;s
=getchar();}
while(s
>='0'&&s
<='9'){d
=d
*10+s
-'0';s
=getchar();}
return d
*f
;
}
using namespace std
;
LL
ksm(LL x
,LL y
)
{
LL s
=1;
while(y
)
{
if(y
&1) (s
*=x
)%=LZX
;
(x
*=x
)%=LZX
;y
>>=1;
}
return s
%LZX
;
}
LL F
[500005];
int main()
{
F
[1]=1;
for(LL i
=2;i
<=500000;i
++) F
[i
]=F
[i
-1]*i
%LZX
;
LL n
=read();
if(n
==1) return !printf("1");
LL len
=read(),ans
=1;;
for(LL i
=2;i
<=n
;i
++)
{
LL b
=read();
if(b
!=1) (ans
*=F
[len
+b
-1]*ksm(F
[b
-1],LZX
-2)%LZX
*ksm(F
[len
],LZX
-2)%LZX
)%=LZX
;
len
+=b
;
}
cout
<<ans
%LZX
;
return 0;
}