记录编号 202485 评测结果 AAWAAAATTT
题目名称 [SYOI 2015] Asm_Def排兵布阵 最终得分 60
用户昵称 Gravatar前鬼后鬼的守护 是否通过 未通过
代码语言 C++ 运行时间 3.458 s
提交时间 2015-11-01 12:07:45 内存使用 38.95 MiB
显示代码纯文本
#include<cstdio>
typedef long long ll;
const ll mod=998244353LL;
inline int read(){
	int x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x;
}
int k,sum[1010];
ll f[5010][1010];
int p[10010],tot;bool not_p[10010];
void pre(){
	for(int i=2;i<=sum[k];i++)if(!not_p[i]){
		p[tot++]=i;
		for(int t=i*i;t<=sum[k];t+=i)not_p[t]=true;
	}
	p[tot]=1<<30;
}
inline ll P(int x,int y){if(x<sum[y])return 0;
	int n=x-1-sum[y-1],m=sum[y]-sum[y-1]-1;
	ll ans=1;
	for(int i=0;p[i]<=n;i++){
		int e=0;
		for(int t=p[i];t<=n;t*=p[i])
			e+=n/t-m/t-(n-m)/t;
		for(int base=p[i];e;e>>=1){
			if(e&1)ans=ans*base%mod;
			base=base*base;
		}
	}
	return ans;
}
int main(){
	freopen("asm_formation.in","r",stdin);freopen("asm_formation.out","w",stdout);
	k=read();for(int i=1;i<=k;i++)sum[i]=sum[i-1]+read();
	if(sum[k]>10000){printf("%d");return 0;}pre();
	for(int i=1;i<=sum[k];i++)f[i][0]=1;
	for(int i=1;i<=sum[k];i++)
		for(int j=1;j<=k;j++)
			f[i][j]=(f[i-1][j-1]*P(i,j)%mod+f[i-1][j])%mod;
	printf("%lld",f[sum[k]][k]);
	return 0;
}