catalan數的應用 變形 HDU1133

2021-06-12 07:08:53 字數 1124 閱讀 9869

檢視維基百科,對卡特蘭數公式證明是這樣的:

令1表示進棧,0表示出棧,則可轉化為求乙個2n位、含n個1、n個0的二進位制數,滿足從左往右掃瞄到任意一位時,經過的0數不多於1數。顯然含n個1、n個0的2n位二進位制數共有

考慮乙個含n個1、n個0的2n位二進位制數,掃瞄到第2m+1位上時有m+1個0和m個1(容易證明一定存在這樣的情況),則後面的0-1排列中必有n-m個1和n-m-1個0。將2m+2及其以後的部分0變成1、1變成0,則對應乙個n+1個0和n-1個1的二進位制數。反之亦然(相似的思路證明兩者一一對應)。

從而從以上證明啟發,來得到hdu1133的公式:

懶得打字,在紙上列好草稿,發上來:

對最後結果化簡後:

最後的公式為 :  ( c(m

+n, n) 

-c(m

+n, m+1

) ) *m

!*n!

化簡即 (m+n)

!*(m-

n+1) 

/(m+1

)最後給出**,大數處理方案的:

用到大數乘法(乘小的數)和除法(除小的數):

#include #include using namespace std;

#define max 100

#define base 10000

void multiply(int a,int max,int b) //大數乘小數

}void divide(int a, int max, int b) //大數除小數

memcpy ( res , fact[m+n] , max * sizeof ( int ) ); //階乘 ( m + n )!

multiply ( res, max, m - n + 1 ); // ( m + n )! * ( m-n+1 )

divide ( res, max, m + 1 ); // ( m + n )! * ( m-n+1 ) / ( m+ 1 )

output ( res );

}return 0;

}

Catalan數應用整理

時間限制 1 s 空間限制 128000 kb 題目等級 gold 乙個有n個結點的二叉樹總共有多少種形態 輸入描述 input description 讀入乙個正整數n 輸出描述 output description 輸出乙個正整數表示答案 樣例輸入 sample input 樣例輸出 sampl...

Catalan數計算及應用

問題描述 卡塔蘭數,是組合數學 中乙個常出現在各種計數問題中出現的數列。輸入乙個整數n,計算h n 其遞迴式如下 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 其中n 2,h 0 h 1 1 該遞推關係的解為 h n c 2n,n n 1 n 1,2,3,思路 直接根據遞迴式,...

Catalan數計算及應用

問題描述 卡塔蘭數,是組合數學 中乙個常出現在各種計數問題中出現的數列。輸入乙個整數n,計算h n 其遞迴式如下 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 其中n 2,h 0 h 1 1 該遞推關係的解為 h n c 2n,n n 1 n 1,2,3,思路 直接根據遞迴式,...