Description
Data Constraint
Sotution
我们不妨倒着过来想。设有现在总共有num个球,先放第n种球,那么显然第n种球的最后一个一定要放在最后一个位置,这样方案数就为
Ca[n]−1num−1
,再往下推,现在放第n-1种球,显然,第n-1种球的最后一个一定要放在当前剩下的最后一个位置,样方案数就为
Ca[n]−1num−1
*
Ca[n−1]−1num−a[n]−1
,这样我们就可以得到一个递推式ans=
∏1i=nCa[i]−1j−1(j=∑ij=1a[j])
。
代码
using namespace std;
const int maxn=500005,maxn1=998244353;
ll f[maxn],c[maxn],n,i,t,j,k,l,a[maxn],ans;
bool bz[maxn];
ll mi(ll x,int y){
if (y==1) return x;
ll t=mi(x,y/2);
if (y%2) return t*t%maxn1*x%maxn1;return t*t%maxn1;
}
ll c1(ll x,ll y){
return c[x]*mi(c[y],maxn1-2)%maxn1*mi(c[x-y],maxn1-2)%maxn1;
}
int main(){
// freopen("data.in","r",stdin);
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]),t+=a[i];k=t;
c[0]=1;
for (i=1;i<=t;i++)
c[i]=c[i-1]*i%maxn1;ans=1;
for (i=n;i>=1;i--)
ans=(ans*c1(t-1,a[i]-1))%maxn1,t-=a[i];
printf("%d\n",ans);
}