檢視維基百科,對卡特蘭數公式證明是這樣的:
令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,思路 直接根據遞迴式,...