比赛 |
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;
}