卡特兰数,这是一向掌握不大熟练的内容,今天借NOIP2003普及组的第三题来总结一下。当然由于原题数据弱抱,不需要高精。如果有时间我会不断补充这篇文章里的内容。
二话不说上代码
//Catalan
#include<iostream>
using namespace std;
long long n,f[20]={0};
/*NO.1 f[n+1]=f[i]*f[n-i]from 0 to n plus f[0]=1
int main(){
cin>>n;
f[0]=1;f[1]=1;
for (int i=2;i<=n;i++){
for (int j=0;j<i;j++){
f[i]+=f[j]*f[i-j-1];
}
}
cout<<f[n];
return 0;
}
*/
/*NO.2 f[n+1]=((4n+2)*f[n])/(i+2) f[0]=1
int main(){
cin>>n;
f[0]=1;
for (int i=0;i<n;i++) f[i+1]=(4*i+2)*f[i]/(i+2);
cout<<f[n];
return 0;
}
*/
/*NO.3 WRONG!right when n<=9 f[n]=(n+2 multi to 2n)/(n!) even use son*(n+i)/i is also wrong,refering to real number(double)
int main(){
cin>>n;
int son=1;
for (int i=n+2;i<=2*n;i++) son*=i;
for (int i=n;i>=2;i--) son/=i;
cout<<son;
}
*/
int(longint)在n<=18的时候没问题,再大就要用long long(int64) 范围是9223372036854775807,即922亿亿 第30个卡特兰数是一亿亿 所以高精是非常重要的
有一个很好的博客 http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html总结了一些资料
【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解
原文:http://blog.csdn.net/ametake/article/details/43954617