题目
题解思路
有关卡特兰数的证明和应用 参考大佬的博客
加上这个 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); (通常会爆数值 )
这题 原本只用C n 2n 加上了限制条件为不能越界 但是答案还是必须 x的选择个数和 y的相同
根据卡特兰数 C n-1 2n 就是 其中 X大于或者小于Y的个数 减去 再加倍即可得出答案 因为从左下方和右上方是等价的。
AC代码
模拟组合数
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll zuhe (int a ,int b )
{
int i = a+1;
ll zi = 1 ,mu = 1;
while(a != 0)
{
zi*=b;
mu*=a;
a--;
b--;
}
return 2*zi/mu/i;
}
int main ()
{
int t;
int s = 1;
while(cin>>t && t)
{
cout<<s<<" "<<t<<" "<<zuhe(t,2*t)<<"\n";
s++;
}
return 0;
}
模拟求和公式打表
#include <bits/stdc++.h>
using namespace std;
int main(){
long long cata[40]={0};
Cata[0]=Cata[1]=1;
for(int i=2;i<=35;i++){
for(int j=0;j<i;j++){
cata[i] += Cata[j]*Cata[i-j-1];
}
}
int kase=0,n;
while(scanf("%d",&n)!=EOF && n>0){
printf("%d %d %lld\n",++kase,n,2*Cata[n]);
}
return 0;
}