神奇的組合數學 卡特蘭數

2021-08-08 15:39:16 字數 3476 閱讀 8937

定義:令h(

0)=1

,h(1

)=1 ,catalan數滿足遞推式。h(

n)=h

(0)×

h(n−

1)+h

(1)×

h(n−

2)+.

..+h

(n−1

)×h(

0)(n

≥2) 。

通項公式

證明如下(摘自taocp的原練習題)(數競黨很少用不嚴格證明的定理):

1.括號對:合法的括號對對數答案為h(

n)。

2.二叉樹:合法的樹有答案為h(

n)。

3.分多邊形:有h(

n)種分法,用這個可以簡單的證明卡特蘭數的通項:

不妨設h(i

) 為

i 邊形的答案,明顯,有h(

i)=h

(n)=

h(1)

×h(n

−1)+

h(2)

×h(n

−2)+

...+

h(n)

h(0)

。又因為我們可以得到,總共的分法有 c(

n,n2

) 個,不合法的是乙個「逆序相交」,從而不合法的有:∑c

(n−t

,t)∗

c(t,

1)故相減可得有 所以得證(肯定有人注意到了,這個h(

n)的式子與卡特蘭數的不符合,實際上這是卡特蘭數的另一種遞推式)。

例題:

?題?(別笑,題目就叫「題」)

題目:

出個題就好了.這就是出題人沒有寫題目背景的原因.

你在平面直角座標系上.

你一開始位於(0,0).

每次可以在上/下/左/右四個方向中選乙個走一步.

即:從(x,y)走到(x,y+1),(x,y-1),(x-1,y),(x+1,y)四個位置中的其中乙個.

允許你走的步數已經確定為n.現在你想走n步之後回到(0,0).但這太簡單了.你希望知道有多少種不同的方案能夠使你在n步之後回到(0,0).當且僅當兩種方案至少有一步走的方向不同,這兩種方案被認為是不同的.

答案可能很大所以只需要輸出答案對10^9+7取模後的結果.(10^9+7=1000000007,1和7之間有8個0)

這還是太簡單了,所以你給能夠到達的格點加上了一些限制.一共有三種限制,加上沒有限制的情況,一共有四種情況,用0,1,2,3標號:

0.沒有任何限制,可以到達座標系上所有的點,即能到達的點集為

1.只允許到達x軸非負半軸上的點.即能到達的點集為

2.只允許到達座標軸上的點.即能到達的點集為

3.只允許到達x軸非負半軸上的點,y軸非負半軸上的點以及第1象限的點.即能到達的點集為

【輸入格式】

一行兩個整數(空格隔開)n和typ,分別表示你必須恰好走的步數和限制的種類.typ的含義見【題目描述】.

【輸出格式】

一行乙個整數ans,表示不同的方案數對10^9+7取模後的結果.

【樣例輸入0】

1000

【樣例輸出0】

383726909

【樣例輸入1】

1001

【樣例輸出1】

265470434

【樣例輸入2】

1002

【樣例輸出2】

376611634

【樣例輸入3】

1003

【樣例輸出3】

627595255

【資料範圍】

10%的資料,typ=0,n<=100

10%的資料,typ=0,n<=1000

5%的資料, typ=0,n<=100000

10%的資料,typ=1,n<=100

10%的資料,typ=1,n<=1000

5%的資料, typ=1,n<=100000

10%的資料,typ=2,n<=100

15%的資料,typ=2,n<=1000

10%的資料,typ=3,n<=100

10%的資料,typ=3,n<=1000

5%的資料, typ=3,n<=100000

以上11部分資料沒有交集.

100%的資料,保證n為偶數,2<=n<=100000,0<=typ<=3.

題解:明顯第二個的答案就是h(

n),第四個可以看成是兩個維度的第二題,所以形式應該是h(

n)×h

(f(n

)),然後待定係數法確定係數,再用數學歸納法證明一下就可以了,結果是ca

t(n)

∗cat

(n+2

) (ca

t(x)

就是指卡特蘭數的第x項)。第乙個易推為[c

(n,n

2)]2

,又注意到第三個範圍極小,從而dp解決(好吧,好像就沒有公式,所以只有1000) ,就是加法原理做啊。**如下。

**:

#include

#include

typedef long long ll;

const ll mod = 1000000007;

using namespace std;

ll q_pow(ll a,ll b)

return ans%mod;

}ll catalan(ll n)

ll n , typ;

int main()

else

if (typ==1)

else

if (typ==2)//水水的dp,加法原理

dp[0][i][n+1] = (dp[0][i-1][n + 2] + dp[1][i-1][n + 2] + dp[0][i-1][n] + dp[1][i-1][n] )%mod;

dp[1][i][n+1] = dp[0][i][n+1];

}

printf("%lld\n",dp[0][n][n+1]);

}else

if (typ==3)

return

0;}

這些數學題好啊,以後要多學點。

組合數學 卡特蘭數

我們以一道題為例來介紹卡特蘭數 給定n n 個0 0 和n n個1 1,它們將按照某種順序排成長度為2 n 2n的序列,求它們能排列成的所有序列中,能夠滿足任意字首序列中0 0的個數都不少於1 1的個數的序列有多少個。輸出的答案對109 7 109 7取模。109 7 為了便於解決,我們可以把這個問...

組合數學 卡特蘭數總結

卡特蘭數 問題 n對括號有多少種合法的匹配方式?卡特蘭數的常見應用之一 結論 對於n對括號,合法的排列共有c n,2n c n 1,2n 基本思路 考慮n對括號,有n個 和n個 對於任意乙個 其前面必定有乙個 跟他對應,如果沒有則是非法序列。也就是說,對於 其前面的 的數量必須大於等於 的數量。假設...

組合數學 小兔的棋盤(卡特蘭數)

題目鏈結 小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小兔有所失望。不過沒過幾天發現了棋盤的好玩之處。從起點 0,0 走到終點 n,n 的最短路徑數是c 2n,n 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的路徑數有多少?小兔想了很長時間...