定義:令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 現在小兔又想如果不穿越對角線 但可接觸對角線上的格點 這樣的路徑數有多少?小兔想了很長時間...