注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
由于冥王星H将军的强大攻势,已经攻占了地球的几个国家,地球决定派出他们的大使Wing和Pluto的大使xiaolonghingis进行和谈。
经过艰苦的谈判,最终冥王星开除了谈判的条件:
1 恢复Pluto的行星地位,并对战争进行赔偿。
2 完成由Pluto国王zhao0057出的一道智力题
题目描述如下:
由于冥王星采用二进制进位的制度,所以那里的居民经常会提出一些有关于二进制数的问题,其中之一是:给出n个0与n个1,将其按照一定顺序进行排列,则从左向右数,1的累计数总是大于或等于0的累计数,那么这样的排列一共有多少种?地球的命运掌握在你的手中了。
Input
输入第一行是一个正整数 T (T<=10) 表示测试数据的组数。
接下来T行,每一行包括一个数字n(n<=10),表示0和1的个数。
Output
对于每组输入,输出排列的个数。
Sample Input
2
1
2
Sample Output
1
2
Hint
n=1,那么只有10一种组合,n=2,有1010,1100两种组合
Source
zhao0057@Pluto
这是一个
卡特兰数问题,知道结论便直接能解了
#include <iostream>
using namespace std;
long long C(long long a, long long b)
{
long long i = 1;
long long num = 1;
for (; i <=b; i++)
{
num = num * a / i;
a--;
}
return num;
}
long long Catalan(long long n)
{
return C(2*n, n) / (n + 1);
}
int main()
{
long long x, n;
cin >> x;
while (x--)
{
cin >> n;
cout << Catalan(n) << endl;
}
// system("pause");
return 0;
}