求出栈序列的个数
各位大牛,小第再问一个问题。对于出栈序列的问题。问题描述:给你一个正整数n,入栈的序列为1,2,....n,那么正确的出栈序列有多少个。例子:比如n=3,那么出栈序列共有5个。分别是:1,2,3;1,3,2;2,1,3;2,3,1;3,2,1
下面的是问题的地址。
http://acm.hdu.edu.cn/showproblem.php?pid=1023
其实我已经知道了这个数是怎么求的了。现在想问的是当n=100时,该有什么好的方法来求得最终的这个数。因为这个数可能比较大。int64是无法表示的。
[解决办法]
这个好像卡特兰数吧。是不是要自己定义大数进行运算??
[解决办法]
对,卡特兰数,要用大数来做。。
a(n+1)=(4n+2/n+2)*a(n);
- C/C++ code
#include"stdio.h"int a[101];int main(){int n,i,j,r1,r2,t,len;while(scanf("%d",&n)==1){for(i=0;i<=101;i++)a[i]=0;a[1]=1;len=1;for(i=2;i<=n;i++){t=i-1;for(j=1,r1=0;j<=len;j++) /*乘*/{a[j]=a[j]*(4*t+2)+r1;r1=a[j]/10;a[j]=a[j]%10;}while(r1){len++;a[len]=r1%10;r1=r1/10;}for(j=len,r2=0;j>0;j--){ //除a[j]=10*r2+a[j];r2=a[j]%(t+2);a[j]=a[j]/(t+2);}while(!a[len]) //前导0的处理len--;}for(i=len;i>0;i--)printf("%d",a[i]);printf("\n");}return 0;}
[解决办法]
卡特兰数有公式的:c(2n, n)/(n+1).