3113 二叉树计数2

3113 二叉树计数2

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

一个有n个结点的二叉树总共有多少种形态

输入描述 Input Description

读入一个正整数n

输出描述 Output Description

输出一个正整数表示答案

样例输入 Sample Input

5

样例输出 Sample Output

42

数据范围及提示 Data Size & Hint

1<=n<=100

分类标签 Tags 点此展开 

 
 
题解:就是卡特兰数+高精度

其实在代码中我用二维矩阵做了初始化= =

其实就是catalan+高精度的应用,f(n)有几个表达式,f(n)=f(0)f(n-1)+f(1)f(n-2)+f(2)f(n-3)+...+f(n-1)f(0)=C(2n,n)/(n+1)=(4n-2)/(n+1)*f(n-1),这里用的是最后一个。

ps:只用long long只能拿60分
 
AC代码:
#include<cstdio>
using namespace std;
const int N=1e6+10;
int n,len;
int f[N];
void mul(int x){
    for(int i=1;i<=len;i++) f[i]*=x;
    for(int i=1;i<=len;i++){
        f[i+1]+=f[i]/10;
        f[i]=f[i]%10;
    }
    while(f[len+1]){
        f[len+2]=f[len+1]/10;
        f[len+1]%=10;
        len++;
    }
}
void div(int x){
    for(int i=len;i>=1;i--){
        f[i-1]+=f[i]%x*10;
        f[i]/=x;
    }
    for(int i=len;i>=1;i--)if(f[i]){len=i;break;}
}
int main(){
    scanf("%d",&n);
    f[len=1]=1;
    for(int i=1;i<=n;i++)mul(4*i-2),div(i+1);
    for(int i=len;i;i--) printf("%d",f[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5642521.html