比赛 Asm_Def战记之透明计算网络 评测结果 AWAWWWWWWW
题目名称 Asm_Def排兵布阵 最终得分 20
用户昵称 lmm 运行时间 0.066 s
代码语言 C++ 内存使用 95.90 MiB
提交时间 2015-11-01 11:57:55
显示代码纯文本
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;

const int MAXN=1005;
const int MAXSUM=5005;
const int MOD=998244353;
int k;
int _max=0;
int num[MAXN],s[MAXN],f[MAXN];

int read(){
	int r=0;char c;
	while(!isdigit(c=getchar()));
	while(r=r*10+c-'0',isdigit(c=getchar()));
	return r;
}
int power(int a,int x){
	if(x==0) return 1;
	long long ls=power(a,x/2);
	ls*=ls;
	if(x&1) return int(ls*a%MOD);
	else return int(ls%MOD);
}
int S[MAXSUM][MAXSUM]={0};
int inv[MAXSUM];
void make_table(int n,int m){
	for(int i=1;i<=n;i++) {
		S[i][i]=S[i][1]=1;
		for(int j=2;j<i;j++)
			S[i][j]=(j*S[i-1][j]+S[i-1][j-1])%MOD;
	}
	for(int i=1;i<=m;i++){
		inv[i]=power(i,MOD-2);
	}
}
int C[MAXSUM]={0};
int divide(int n,int m){
	//printf("%d %d\n",n,m);
	if(n==0) return 1;
	int ans=0;
	C[0]=1;
	for(int i=1;i<=m;i++) C[i]=((long long)C[i-1]*(m-i+1)%MOD*inv[i])%MOD;
	for(int i=1;i<=m;i++){
		ans+=S[n][i]*C[i];
		//printf("%d %d %d\n",n,i,ans);
	}
	return ans;
}

int main(){
#ifdef bhiaibogf
	freopen("in.in","r",stdin);
#else
	freopen("asm_formation.in","r",stdin);
	freopen("asm_formation.out","w",stdout);
#endif
	k=read();
	for(int i=0;i<k;i++){
		num[i]=read();
		_max=max(_max,num[i]);
		s[i]=num[i]+(i?s[i-1]:0);
	}
	make_table(_max,s[k-2]+1);
	f[0]=1;
	for(int i=1;i<k;i++){
		long long d=f[i-1]*divide(num[i]-1,s[i-1]+1);
		f[i]=d%MOD;
	}
	//printf("%d %d\n",num[n-1]-1,s[n-2]+1);
	printf("%d\n",f[k-1]);
	return 0;
}