码迷,mamicode.com
首页 > 其他好文 > 详细

【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解

时间:2015-02-26 18:39:13      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:卡特兰数   catalan   递推   高精   数学   

卡特兰数,这是一向掌握不大熟练的内容,今天借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全国联赛普及组第三题 题解

标签:卡特兰数   catalan   递推   高精   数学   

原文地址:http://blog.csdn.net/ametake/article/details/43954617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!