题目地址
题解:无脑的递推,就是
F[i]=F[i-1]*C(sum[i]-1,num[i]-1);
sum[i]表示前i种兵的总个数
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const long long MOD=998244353;
const int MAXN=1e5+10;
const int MAXM=5e5+10;
long long k,a[MAXN],sum[MAXN];
long long fun[MAXM],f[MAXN];
void exgcd(long long a,long long b,long long &x,long long &y,long long &z){
if(!b){
z=a;
x=1;
y=0;
}
else{
exgcd(b,a%b,y,x,z);
y-=x*(a/b);
}
}
int main(){
//freopen("asm_formation.in","r",stdin);
//freopen("asm_formation.out","w",stdout);
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%d",&a[i]),sum[i]+=sum[i-1]+a[i];
fun[0]=1;
for(int i=1;i<=sum[k];i++)
fun[i]=(fun[i-1]%MOD*i)%MOD;
f[1]=1;
for(int i=2;i<=k;i++){
long long temp_a=(fun[a[i]-1]*fun[sum[i-1]])%MOD;
long long x,y,z;
exgcd(MOD,temp_a,x,y,z);
long long temp1=temp_a/z;
long long temp2=MOD/z;
if(x>0){
long long r=x/temp1;
r++;
y+=r*temp2;
y%=MOD;
}
if(y<0){
long long r=y/temp2;
r++;
y+=r*temp2;
y%=MOD;
}
long long temp_b=fun[sum[i]-1];
long long ans=(temp_b*y)%MOD;
//printf("temp_b=%d\n",temp_b);
f[i]=(f[i-1]*ans)%MOD;
}
printf("%d",f[k]);
return 0;
}