UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)

题目链接:UVa 10007

题意:统计n个节点的二叉树的个数

1个节点形成的二叉树的形状个数为:1

2个节点形成的二叉树的形状个数为:2

3个节点形成的二叉树的形状个数为:5

4个节点形成的二叉树的形状个数为:14

5个节点形成的二叉树的形状个数为:42

把n个节点对号入座有n!种情况

所以有n个节点的形成的二叉树的总数是:卡特兰数F[n]*n!

程序:

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3 public class Main {
 4     public static void main(String args[]){
 5         Scanner cin=new Scanner(System.in);
 6         BigInteger h[]=new BigInteger[302];
 7         BigInteger a[]=new BigInteger[302];
 8         BigInteger fact=BigInteger.valueOf(1);
 9         int n;
10         h[1]=BigInteger.valueOf(1);
11         a[1]=BigInteger.valueOf(1);
12         for(int i=2;i<=300;i++){
13             fact=fact.multiply(BigInteger.valueOf(i));
14             BigInteger k=BigInteger.valueOf(i*4-2);
15             h[i]=h[i-1].multiply(k);
16             h[i]=h[i].divide(BigInteger.valueOf(i+1));
17             a[i]=h[i].multiply(fact);
18             //System.out.println(" "+h[i]+" "+fact+" "+a[i]);
19         }
20         while(true){
21             n=cin.nextInt();
22             if(n==0)
23                 break;
24             System.out.println(a[n]);
25         }
26     }
27 }
时间: 2024-12-22 21:39:49

UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)的相关文章

UVa 10007 - Count the Trees

题目:统计n个节点的二叉树的个数. 分析:组合,计数,卡特兰数,大整数. n个节点的二叉树的形状有Cn个,求不同的树的个数,用卡特兰数乘以全排列n! 说明:打表计算,查询输出,提高效率. #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int C[305][2005] = {0}; int main() { C[1][0] = 1; for (int i = 2

FZU 1775 Counting Binary Trees 卡特兰数前n项和%m(m可为非素数

题目链接:点击打开链接 题意: 卡特兰数前n项和 结果%m 把答案当成2部分搞. #include<stdio.h> #include<cmath> #define int __int64 const int N = 100000; struct inverse_element{ int x, y, q; void extend_Eulid(int a,int b) { if(b == 0){ x = 1;y = 0;q = a; }else{ extend_Eulid(b,a%b

hdu 1130How Many Trees?(卡特兰数)

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 656412042

nyoj 28-大数阶乘 (大数模板)

28-大数阶乘 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:19 submit:39 题目描述: 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入描述: 输入一个整数m(0<m<=5000) 输出描述: 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入: 复制 50 样例输出: 3041409320171337804361260816606476884437764156896051200000

HDU-1134 卡特兰数+java大数模板

题意: 给你一个n,然后1,2,3...2n-1,2n围一圈,让每个数都能用一条线配对并且线与线之间不能交叉,问有几种方法数. 思路: 1 可以和2,4,6...连接.假如   一共有8个数,1和2连接  剩下的3,4,5,6,7,8就相当于 1 import java.math.*; 2 import java.util.Scanner; 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner i

hdu 1131 Count the Trees

卡特兰数*阶乘就是答案     第一次用java..高精度写起来好快....不过代码比较丑.. import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String []args) { Scanner cin = new Scanner(System.in); int i,ii; BigInteger []c= new BigInteger[105]; B

【卡特兰数】【数论】

前几个卡特兰数:规定C0=1,而 C1=1,            C2=2,             C3=5,              C4=14,            C5=42, C6=132,       C7=429,         C8=1430,       C9=4862,        C10=16796, C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845. 求卡特兰数的公式有一下几个: h(n) = h(n

UVa 10007 &amp; hdu 1131 Count the Trees (卡特兰数)

Count the Trees Time Limit:3000MS    Memory Limit:0KB     64bit IO Format:%lld & %llu SubmitStatus Description  Count the Trees  Another common social inability is known as ACM (Abnormally Compulsive Meditation). This psychological disorder is somewh

Count the Trees 典型卡特兰数

Count the Trees 题目分析:给你n个分别标为1,2,...,n的节点,问可以构成多少棵而叉树. 分析:首先考虑n个节点是相同的.任选一个节点做跟节点,那么剩下的n-1个节点构成跟节点的左子树和又子数. h[n] = h[0] * h[n-1] + h[1] * h[n - 2] + ... + h[n-1] * h[0];这正是卡特蓝表达式. h[n] = h[n-1] * (4 * n - 2) / (n + 1).   h[n] = C(2 * n,n)/(n + 1); 对于