组合数学 —— 卡特兰数列(Catalan)
生活随笔
收集整理的這篇文章主要介紹了
组合数学 —— 卡特兰数列(Catalan)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
卡特蘭數列是組合數學中一個常出現在各種計數問題中出現的數列,其前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ......
卡特蘭數首先是由歐拉在計算對凸 n 邊形的不同的對角三角形剖分的個數問題時得到的,即在一個凸 n 邊形中,通過不相交于 n 邊形內部的對角線,把 n 邊形拆分成若干三角形,不同的拆分數目用 Hn 表示,Hn 即為卡特蘭數。
【公式】
1.遞歸公式 1
2.遞歸公式 2
3.組合公式 1
4.組合公式 2
【應用】
【實現】
1.n<=35 的卡特蘭數的實現
LL h[36]; void init() {h[0]=h[1]=1;for(int i=2; i<=35; i++) {h[i]=0;for(int j=0; j<i; j++)h[i]=h[i]+h[j]*h[i-j-1];cout<<h[i]<<endl;} }2.n<100 的卡特蘭數的實現
#define BASE 10000 int a[100+5][100]; void multiply(int num,int n,int b) {//大數乘法int temp=0;for(int i=n-1; i>=0; i--) {temp+=b*a[num][i];a[num][i]=temp%BASE;temp/=BASE;} } void divide(int num,int n,int b) {//大數除法int div=0;for(int i=0; i<n; i++) {div=div*BASE+a[num][i];a[num][i]=div/b;div%=b;} } void init(){memset(a,0,sizeof(a));a[1][100-1]=1;for(int i=2; i<=100; i++) {memcpy(a[i],a[i-1],sizeof(a[i-1]));multiply(i,100,4*i-2);divide(i,100,i+1);} } int main() {init();int n;while(scanf("%d",&n)!=EOF){int i;for(i=0;i<100 && a[n][i]==0;i++);printf("%d",a[n][i++]);for(;i<100;i++)printf("%04d",a[n][i]);printf("\n");}return 0; }?【例題】
- 小兔的棋盤(HDU-2067)(n<=35的卡特蘭數):點擊這里
- Game of Connections(POJ-2084)(n<100的卡特蘭數):點擊這里
- 小a的學期(2019牛客寒假算法基礎集訓營 Day1-H)(卡特蘭數列+組合數取模):點擊這里
總結
以上是生活随笔為你收集整理的组合数学 —— 卡特兰数列(Catalan)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Best Cow Line(POJ-36
- 下一篇: Running(POJ-3661)