记录编号 443793 评测结果 AAAAAAAAAA
题目名称 [SYOI 2015] Asm_Def排兵布阵 最终得分 100
用户昵称 GravatarShirry 是否通过 通过
代码语言 C++ 运行时间 0.061 s
提交时间 2017-09-01 11:07:19 内存使用 10.59 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 998244353
using namespace std;
const int maxn=500010;
const int maxm=100010;
int k,num[maxn],sum[maxm],f[maxm];
long long tmp=1,ans=1,fac[maxn],inv[maxn];
void init(){
	fac[0]=1;
	for(int i=1;i<=sum[k];i++)fac[i]=(fac[i-1]*i)%mod;
	int p=mod-2;
	while(p){//费马小定理求阶乘逆元
		if(p%2)tmp=(tmp*fac[sum[k]])%mod;
		p/=2;
		fac[sum[k]]=(fac[sum[k]]*fac[sum[k]])%mod;
	}
	inv[sum[k]]=tmp;
	for(int i=sum[k]-1;i>=0;i--)inv[i]=(inv[i+1]*(i+1))%mod;
}
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",&num[i]),sum[i]=sum[i-1]+num[i];
	init();
	for(int i=1;i<=k;i++){
		ans=(ans*fac[sum[i]-1])%mod;
		ans=(ans*inv[num[i]-1])%mod;
		ans=(ans*inv[sum[i]-num[i]])%mod;
	}
	printf("%lld\n",ans);
	return 0;
}