标签:splay name its 预处理 mes style 有关 应用 sed
卡特兰数参考链接 ( 里面有关于其在一些题目的应用 )
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]
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; }
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; }
标签:splay name its 预处理 mes style 有关 应用 sed
原文地址:https://www.cnblogs.com/Rubbishes/p/9468916.html