卡特蘭數(含h n p的盧卡斯求法)

2021-10-07 11:33:10 字數 3516 閱讀 9943

卡特蘭數(catalan number)又稱卡塔蘭數,卡特蘭數是組合數學中乙個常出現在各種計數問題中的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名。

遞推實現(在此用cnc_

cn​表示卡特蘭數的項數):

c n+

1=c0

cn+c

1cn−

1+…+

cnc0

(c0=

1,c1

=1,n

≥1

)\beginc_=c_c_+c_c_+\ldots +c_c_\\ \left( c_=1,c_=1,n\geq 1\right) \end

cn+1​=

c0​c

n​+c

1​cn

−1​+

…+cn

​c0​

(c0​

=1,c

1​=1

,n≥1

)​化簡(以後用hnh_

hn​表示卡特蘭數的項數,cnc_

cn​表示組合數公式):

h (n

)=h(

n−1)

4n−2

n+

1h\left( n\right) =h\left( n-1\right) \dfrac

h(n)=h

(n−1

)n+1

4n−2

​其解為:

h (n

)=c2

nnn+

1=c2

nn−c

2nn−

1(n=

0,1,

2…

)\beginh\left( n\right) =\dfrac _}=c^_-c^_\\ \left( n=0,1,2\ldots \right) \end

h(n)=n

+1c2

nn​​

=c2n

n​−c

2nn−

1​(n

=0,1

,2…)

​由於卡特蘭數很大,超過33中間數就超了unsigned long long型了,所以n

<=33

(h(0

)=1,

h(1)

=1

)n<=33 (h(0)=1,h(1)=1)

n<=3

3(h(

0)=1

,h(1

)=1)

時可以用如下方法

(注意是cat

alan

[i−1

]∗(4

∗i−2

)catalan[i - 1] * (4 * i - 2)

catala

n[i−

1]∗(

4∗i−

2)不能爆unsigned long long:18446744073709551615)

#include

using

namespace std;

typedef

unsigned

long

long ull;

intmain()

;for

(int i =

2; i <=

33; i++

) catalan[i]

= catalan[i -1]

*(4* i -2)

/(i +1)

;printf

("%llu"

, catalan[n]);

return0;

}

其前幾項為(從第零項開始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430…

思路:

套用組合數板子即可

**:

求卡特蘭數h(6)=132(從第零項開始)

//求卡特蘭數h(6)=132(從第零項開始) 

#include

#define ll long long

#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)

using

namespace std;

const

int mod=

1e9+7;

intqpow

(int a,

int k)

//k>>1:編譯器檢查不出來的錯誤

return ans;

}int

inverse

(int a)

//費馬小定理

intc

(int n,

int m)

return ans;

}int

main()

公式:h(n

)%p=

(luc

as(2

n,n,

p)−l

ucas

(2n,

n−1,

p)+p

)h(n)\%p=(lucas(2n,n,p)-lucas(2n,n-1,p)+p)%p

h(n)%p

=(lu

cas(

2n,n

,p)−

luca

s(2n

,n−1

,p)+

p)(取模前前者一定大於後者,相減一定為正,而取模後就不一定了,所以要加乙個p,保證是正數)

**:

求卡特蘭數h(6)=132(從第零項開始)

//求卡特蘭數h(6)=132(從第零項開始) 

#include

#define ll long long

#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)

using

namespace std;

const

int mod=

1e9+7;

intqpow

(int a,

int k)

//k>>1:編譯器檢查不出來的錯誤

return ans;

}int

inverse

(int a)

//費馬小定理

intc

(int n,

int m)

return ans;

}int

lucas

(int n,

int m)

intmain()

這部分推薦看卡特蘭數(catalan數)總結,總結的非常棒。

卡特蘭數,高精度卡特蘭數

簡單介紹 卡特蘭數是組合數學中常常出現的乙個數列。個人認為不管是遞推公式還是代表的含義都比斐波那契數列難理解一些。遞推公式 應用 1.cn表示長度2n的dyck word的個數。dyck word是乙個有n個x和n個y組成的字串。且全部的字首字串皆滿足x的個數大於等於y的個數。下面為長度為6的dyc...

卡特蘭數和超級卡特蘭數

這篇部落格主要是想講一下超級卡特蘭數 大施洛德數 順帶就想講一下卡特蘭數.卡特蘭數記為 c n c 1 1 forall n geq 2,c n sum c i c 前幾項大概是 1,1,2,5,14,42,132.直接遞推未免效率太低,我們考慮用生成函式優化.顯然有 c x c x 2 x 解得 ...

卡特蘭數 Catalan

問題 程式設計之美 第4.3節中提到了 買票找零 問題,查閱了下資料,此問題和卡特蘭數 cn有關,其定義如下 卡特蘭數真是乙個神奇的數字,很多組合問題的數量都和它有關係,例如 yyy xyxxyy xyxyxy xxyyxy xxyxyy ab c d a bc d ab cd a bc d a b...