卡特蘭數又稱卡塔蘭數,英文名catalan number,是組合數學中乙個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁•查理•卡塔蘭 (1814–1894)命名
原理 令h(0)=1,h(1)=1,catalan數滿足遞推式[1] :
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另類遞推式[2] :
h(n)=h(n-1)*(4*n-2)/(n+1);
遞推關係的解為:
h(n)=c(2n,n)/(n+1) (n=0,1,2,…)
遞推關係的另類解為:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,…)
應用 應用大都可以轉化為2n個包含01的序列要求任意字首中0的個數都大於等於1的個數
1、括號化(左括號為0右括號為1)
矩陣連乘: p=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n-1)種)
2、出棧次序
乙個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?[
類似:有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)
類似:一位大城市的律師在他住所以北n個街區和以東n個街區處工作,每天她走2n個街區去上班。如果他從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?
在《計算機程式設計藝術》,第三版,donald e.knuth著,蘇運霖譯,第一卷,508頁,給出了證明:
問題大意是用s表示入棧,x表示出棧,那麼合法的序列有多少個(s的個數為n)
顯然有c(2n, n)個含s,x各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的s和x,但是違背其它條件)。
在任何不允許的序列中,定出使得x的個數超過s的個數的第乙個x的位置。然後在導致幷包括這個x的部分序列中,以s代替所有的x並以x代表所有的s。結果是乙個有(n+1)個s和(n-1)個x的序列。反過來,對以後每種型別的每個序列,我們都能逆轉這個過程,而且找出導致它的前一種型別的不允許序列。例如xxsxsssxxsss必然來自ssxs***xxsss。這個對應說明,不允許的序列的個數是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1)。
3、將多邊行劃分為三角形問題
將乙個凸多邊形區域分成三角形區域(劃分線不交叉)的方法數?
類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?
4、給定節點組成二叉樹問題。
給定n個節點,能構成多少種形狀不同的二叉樹?
(一定是二叉樹!先取乙個點作為頂點,然後左邊依次可以取0至n-1個相對應的,右邊是n-1到0個,兩兩配對相乘,就是h(0)*h(n-1) + h(2)*h(n-2) + …… + h(n-1)h(0)=h(n)) (能構成h(n)個)
計算
long
long h[40];//n<=35時的catalan數
h[0] = h[1] = 1;
for (int i = 2; i < 40; i++)
}
//根據應用2擴充套件不能穿越對角線通過dp可以推出h(n)
for (int i = 1; i <= n; i++) f[0][i] = 1;
for (int i = 1; i <= n; i++)
#include//大數catalan數
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1005;
const
int cnt = 1e4;
int cal[102][maxn];
int len[maxn];
/*這兩個乘除演算法可以通用,不過在使用時
要注意cnt不能太大否則很容易溢位*/
void multy(int *ans, int b, int &len)
while (r)
}void divid(int *ans, int b, int &len)
while (!ans[len-1])
}int main()
while(cin >> n && n)
return
0;}
賦值運算子與普通運算的不同之處
1 1位元組byte 8bit位 範圍 128至127 2 運算規則 自動型別提公升 byte 1位元組 short 2位元組 char 2位元組 int 4位元組 long 8位元組 float 4位元組 double 8位元組 1位元組 8bit。首先需要了解 byte為什麼是 128到127 ...
大數運算 1 大數儲存
int 16位 32768 32767 注 現在大多數的編譯器的int型是32位的 也就是說跟long型的大小一樣 long long或 int64 64位 9223372036854775808 9223372036854775807 float 32位 精確到小數點後6 7位 double 64...
大數運算 4 大數乘法
首先說一下乘法計算的演算法 同樣是模擬人工計算時的方法。從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果之後,用第二位相乘,記錄結果並且左移一位,以此類推,直到計算完最後一位,再將各項結果相加,得出最後結果。計算的過程基本上和小學生列豎式做乘法相同。為程式設計方便,並不...