问题描述:
宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n,栈A的深度大于n。 现在可以进行两种操作: 1. 进栈操作push 2. 出栈操作pop 使用这2个操作,由一个操作数序列就可以得到一系列的输出序列。 例如,对于一个操作数序列1 2 3,那么出栈序列为: (1)1 2 3 (2)3 2 1 (3)2 1 3 (4)2 3 1 (5)1 3 2 现在对于任意一个N,输入端的数据一定是1,2,3...N。求出可能出现的输出端数据序列的种数。
输入:
第一行为一个数字T,表示有T组数据。 每组数据只含一个整数n(1≤n≤9)
输出:
对于每组数据,输出可能得到的输出序列的总数目。
输入样式:
1
3
输出样式:
5
解题原理:
这里用了栈里面的总次序的一个数学公式,,其中cnt就是我们要求的总次数,而n是指一个栈中存在几个数。
我将这个经过化解后,得到cnt=[(2n)!/(n!*n!)]/(n+1).因此我写了一个factorial来专门处理阶乘。然后用c语言写出这个式子,运算即可。
代码:
#include<stdio.h>
long long int factorial(int n)
{
long long int sum=1;
for (int i=1;i<=n;i++){
sum*=i;
}
return sum;
}
int main()
{
int n,m;
scanf("%d",&m);
while(m--){
scanf("%d",&n);
long long int sum;
sum=factorial(2*n)/(factorial(n)*factorial(n));
sum=sum/(n+1);
printf("%lld\n",sum);
}
return 0;
}