记录编号 129746 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 出栈序列统计 最终得分 100
用户昵称 Gravatarreturn 0; 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2014-10-20 20:33:35 内存使用 0.30 MiB
显示代码纯文本
#include<cstdio>
unsigned long long f[1001];
int sum[1001]={1,1};
int n;
void dt(){f[1]=1;for(int i=2; i<=48; i++)f[i]=2*(2*i-1)*f[i-1]/(i+1);}
inline void multi(int x,int sum[]){int c=(4*x-2);
for(int j=1;j<=sum[0];j++) sum[j]*=c;
for(int j=1;j<=sum[0];j++){if(sum[j]>=10){
			sum[j+1]+=sum[j]/10;sum[j]%=10;
		}}if(sum[sum[0]+1]) sum[0]++;}
inline void divv(int sum[],int x){
	int d=x+1,t=0,tt=0;
	for(int i=sum[0]; i>=1; i--){
		t=sum[i]/d;tt=sum[i]%d;
		sum[i]/=d;sum[i-1]+=10*tt;}
	int l=sum[0];
	while(l--){if(sum[l]>0) {sum[0]=l+1;break;	
		}}}
int main(){	
	freopen("stack1.in","r",stdin);freopen("stack1.out","w",stdout);
	dt();	scanf("%d",&n);sum[0]=16;
 	for(int i=1; i<=16; i++)
		sum[i]=f[30]%10,f[30]/=10;
	if(n<48)printf("%lld",f[n]);
	else{
		for(int i=31; i<=n; i++)multi(i,sum),divv(sum,i);
		for(int i=sum[0]; i>=1; i--){
			if(sum[i]==0&&i==sum[0]) continue;
			printf("%d",sum[i]);
		}}}