记录编号 |
129746 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
出栈序列统计 |
最终得分 |
100 |
用户昵称 |
return 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]);
}}}