首页 > 代码库 > catalan卡特兰数
catalan卡特兰数
catalan卡特兰数:卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数例。由比利时的数学家欧仁·查理·卡塔兰(1814-1894)命名。卡塔兰数的一般公式为 C(2n,n)/(n+1)。
一般计算式为(递归):h(n)=(4n-2)/(n+1)*h(n-1) (n>1),h(0)=1。
计算单个catalan的C++程序:
ll catalan(int n) { if(n==0||n==1) return 1; ll sum=1; for(int i=2;i<=n;i++) sum=(4*i-2)*sum/(i+1); return sum; }
ll ca[100]; void catalan(int n) { ca[0]=ca[1]=1; for(int i=2;i<=n;i++) ca[i]=(4*i-2)*ca[i-1]/(i+1); }
因为第三十项之后catalan数就超long long了,所以附上JAVA大数算的catalan数:
import java.io.*; import java.math.*; import java.util.*; public class Main { private static BigInteger four=BigInteger.valueOf(4); private static BigInteger two=BigInteger.valueOf(2); private static BigInteger []ca=new BigInteger[105]; public static void catalan(int n) { ca[0]=ca[1]=BigInteger.ONE; for(int i=2;i<=n;i++) { BigInteger nn=BigInteger.valueOf(i); BigInteger mm=(four.multiply(nn)).subtract(two); BigInteger ii=nn.add(BigInteger.ONE); ca[i]=(mm.multiply(ca[i-1])).divide(ii); } } public static void main(String[] args) { Scanner cin=new Scanner (new BufferedInputStream(System.in)); catalan(100); while(cin.hasNextInt()) { int n=cin.nextInt(); System.out.println(ca[n]); } } }
卡特兰数的前几项:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
最常用catalan数的是出栈问题:一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?符合catalan数。
wikioi 1086,3112,3113,3134.
还有2014微软编程之美有道题就是catalan数。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。