卡特兰数高精度算法

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

 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("\n");
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 }
时间: 2024-10-07 04:28:37

卡特兰数高精度算法的相关文章

hdu 1023 卡特兰数+高精度

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasi

BZOJ 2822 AHOI 2012 树屋阶梯 卡特兰数+高精度

题目大意:高精度卡特兰数. 思路:上维基上看看,有一个模型和这个题一模一样,然后就剩下水水的高精度了. (谁来教教我java... CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define BASE 10000 #define MAX 100010 using namespace std; struct BigInt{ int num

卡特兰数,高精度卡特兰数

简介:卡特兰数是组合数学中经常出现的一个数列. 个人觉得无论是递推公式还是代表的含义都比斐波那契数列难理解一些. 递推公式: 应用: 1.Cn表示长度2n的dyck word的个数.Dyck word是一个有n个X和n个Y组成的字串,且所有的前缀字串皆满足X的个数大于等于Y的个数.以下为长度为6的dyck words XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY 分析:对于n个X,n个Y的排列来说一共有C(n,2n)种,还要排除其中不符合要求的排列.不符合条件的排列对于某

用到了卡特兰数的性质,还有高精度压位,筛法找素数

一列火车n节车厢,依次编号为1,2,3,-,n. 每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 输入一个整数n,代表火车的车厢数. 输出格式 输出一个整数s表示n节车厢出栈的可能排列方式数量. 数据范围 1≤n≤60000 输入样例: 3 输出样例: 5 这道题的本质是卡特兰数 卡特兰数介绍(引用math73) 筛法求素数 最重要的是如何求解组合数,压位思想,还有组合数C(2n)(n)这个式子展开以后,用上下同时除以连续的质数的方法,将答案一点一点凑出来,

Buy the Ticket(卡特兰数+递推高精度)

Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1886 Accepted Submission(s): 832   Problem Description The \\\\\\\"Harry Potter and the Goblet of Fire\\\\\\\" will be on show i

【BZOJ2822】【AHOI2012】树屋阶梯 卡特兰数 python高精度

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43404565"); } 题解: 首先考虑在当前情况下多加一层,那么我们可以枚举最后一层台阶长度来得到答案. 最后得到的是卡特兰数. 代码: f=[0]*60 f[1]=1 n=int(raw_input()) for i in range(2,n+1

卡特兰数(Catalan Number) 算法、数论 组合~

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

【算法专题】卡特兰数(计数数列)

Catalan数列:1 1 1 2 5 14 42 132 429 1430 4862 16796 [计数映射思想] 参考:卡特兰数 - 计数的映射方法的伟大胜利 计数映射:将难以统计的数映射为另一种形式的可以统计的数. 一.入栈出栈序 n个数字,有多少种合法的入栈出栈序列?n=3时的合法序列之一:+1,-1,+1,+1,-1,-1 对于n个数字,就是要在2n个1中添加n个"+",则序列总数C(2n,n). 对于未入栈先出栈的不合法情况,在其第一次前缀和为-1时,将前面的所有符号反转,

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆