卡特兰数,这是一向掌握不大熟练的内容,今天借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