数学定理及部分代码(长期更新)

1.卡特兰数

前几项为:1, 1, 2, 5, 14, 42, 132,

catalan数满足递推式 [1]   :
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

h(n)=h(n-1)*(4*n-2)/(n+1);

h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

常见问法:(一般就是根据后一个动作发生必须保证前面有动作发生才可以,就像必须有入栈的才可以出栈)

典型的是入栈出栈问题,火车进栈

排队:两排 第二排要比第一排高,第一排可以看成0第二排看成1那么就是求满足条件的01序列有多少

括号化问题,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案

多边形划分为三角形,(类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数)

给定节点组成二叉树的问题

2.默慈金数


 Mn+1=(2n+3)Mn+3nMn-1/(n+3)

 Mn=C(2i,n)* catalan(i)(i=0,1.....n/2)

 

  圆上的个点间,画出彼此不相交弦的全部方法的总数

  方格移动:走法移动步从的可能形成的路径的总数的默慈金数


代码实现:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	static BigInteger num[]=new BigInteger[10005];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin =new Scanner(System.in);
		BigInteger m=BigInteger.TEN.pow(100);
		num[1]=new BigInteger("1");
		num[2]=new BigInteger("2");
		for(int i=2;i<=10000;i++)
		{
			long a=(2*i+3);
			long b=(3*i);
			long c=(i+3);
			num[i+1]=((new BigInteger(""+a).multiply(num[i])).add(new BigInteger (""+b).multiply(num[i-1])).divide(new BigInteger(""+c)));
		}
		while(cin.hasNext())
		{
			int n;
			n =cin.nextInt();
			System.out.println(num[n].mod(m));
		}
	}

}

猜你喜欢

转载自blog.csdn.net/howardemily/article/details/70800081
今日推荐