记录编号 |
443793 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SYOI 2015] Asm_Def排兵布阵 |
最终得分 |
100 |
用户昵称 |
Shirry |
是否通过 |
通过 |
代码语言 |
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;
}