• 卡特兰数高精度算法


    很多组合题都会用到卡特兰数,增长速度又很快,应该写个高精度尊敬一下~

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define ML 549
     5 using namespace std;
     6 int kt[105][550];
     7 int len[105];
     8 int getlen(int ord)
     9 {
    10     int pos;
    11     for(int i=ML;i>=0;i--)
    12         if(kt[ord][i]!=0)
    13         {
    14             pos=i;
    15             break;
    16         }
    17     return pos+1;
    18 }
    19 void mut(int ord)
    20 {
    21     for(int i=0;i<len[ord-1];i++)
    22         kt[ord][i]=kt[ord-1][i]*(4*ord-2);
    23     for(int i=0;i<ML;i++)
    24         if(kt[ord][i]>9)
    25             kt[ord][i+1]+=kt[ord][i]/10,kt[ord][i]%=10;
    26     len[ord]=getlen(ord);
    27 }
    28 void div(int ord)
    29 {
    30     int k=ord+1;
    31     for(int i=len[ord]-1;i>=0;i--)
    32     {
    33         if(i!=0)
    34             kt[ord][i-1]+=(kt[ord][i]%k)*10;
    35         kt[ord][i]/=k;
    36     }
    37     len[ord]=getlen(ord);
    38 }
    39 void ini()
    40 {
    41     memset(kt,0,sizeof(kt));
    42     kt[1][0]=1;
    43     len[1]=1;
    44     for(int i=2;i<=100;i++)
    45     {
    46         mut(i);
    47         div(i);
    48     }
    49 }
    50 void print(int ord)
    51 {
    52     for(int i=len[ord]-1;i>=0;i--)
    53         printf("%d",kt[ord][i]);
    54     printf("
    ");
    55 }
    56 int main()
    57 {
    58     int n;
    59     ini();
    60     while(scanf("%d",&n))
    61     {
    62         if(n==-1) break;
    63         else print(n);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    仪仗队
    疫情控制
    Code
    距离咨询
    舒适的路线
    桐桐的糖果计划
    跑路
    最短路计数
    骑马修栅栏
    搭桥
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/5778248.html
Copyright © 2020-2023  润新知