zoukankan      html  css  js  c++  java
  • 卡特兰数模板

    卡特兰数参考链接 ( 里面有关于其在一些题目的应用 )

    1、前三十项卡特兰数表

    [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,18367353072152,69533550916004,
     263747951750360,1002242216651368,3814986502092304]
    View Code

    2、卡特兰数求模模板

    const int C_maxn = 1e4 + 10;
    LL CatalanNum[C_maxn];
    LL inv[C_maxn];
    inline void Catalan_Mod(int N, LL mod)
    {
        inv[1] = 1;
        for(int i=2; i<=N+1; i++)///线性预处理 1 ~ N 关于 mod 的逆元
            inv[i] = (mod - mod / i) * inv[mod % i] % mod;
    
        CatalanNum[0] = CatalanNum[1] = 1;
    
        for(int i=2; i<=N; i++)
            CatalanNum[i] = CatalanNum[i-1] * (4 * i - 2) %mod * inv[i+1] %mod;
    }
    View Code

    3、卡特兰大数模板

    #include<bits/stdc++.h>
    using namespace std;
    const int C_maxn = 100 + 10;///项数
    
    int Catalan_Num[C_maxn][1000];///保存卡特兰大数、第二维为具体每个数位的值
    int NumLen[C_maxn];///每个大数的数长度、输出的时候需倒序输出
    
    void catalan() //求卡特兰数
    {
        int i, j, len, carry, temp;
        Catalan_Num[1][0] = NumLen[1] = 1;
        len = 1;
        for(i = 2; i < 100; i++)
        {
            for(j = 0; j < len; j++) //乘法
            Catalan_Num[i][j] = Catalan_Num[i-1][j]*(4*(i-1)+2);
            carry = 0;
            for(j = 0; j < len; j++) //处理相乘结果
            {
                temp = Catalan_Num[i][j] + carry;
                Catalan_Num[i][j] = temp % 10;
                carry = temp / 10;
            }
            while(carry) //进位处理
            {
                Catalan_Num[i][len++] = carry % 10;
                carry /= 10;
            }
            carry = 0;
            for(j = len-1; j >= 0; j--) //除法
            {
                temp = carry*10 + Catalan_Num[i][j];
                Catalan_Num[i][j] = temp/(i+1);
                carry = temp%(i+1);
            }
            while(!Catalan_Num[i][len-1]) //高位零处理
            len --;
            NumLen[i] = len;
        }
    }
    
    int main(void)
    {
        catalan();
        for(int i=1; i<=30; i++){
            for(int j=NumLen[i]-1; j>=0; j--){
                printf("%d", Catalan_Num[i][j]);
            }puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    路径规划算法总结
    常用滤波器整理
    Debian 9 strech 安装 ROS lunar
    understand 安装笔记
    protobuf 安装与卸载
    maven-surefire-plugin
    spring数据源、数据库连接池
    日志插件总结
    pom.xml常用元素解析
    BeanFactory笔记
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/9468916.html
Copyright © 2011-2022 走看看