zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    致亲爱的304
    C语言中简单的for循环和浮点型变量
    C程序内存管理
    变量
    我哭了
    那一场邂逅
    如何修改安卓项目的图标
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法
    Android 异步加载
    大家好,第一次用博客记录一些东西
  • 原文地址:https://www.cnblogs.com/shenben/p/5642521.html
Copyright © 2011-2022 走看看