1. 程式人生 > >【楊氏定理+鉤子公式】初步

【楊氏定理+鉤子公式】初步

number 推公式 blank data ati 整數 nbsp 來看 例題

首先,我們來看一個最簡單的問題:

我在學校門口賣奶茶,奶茶一元一杯。今天下午開門的時候,我發現找零的錢忘帶了。

這時候來了 2n 個人,其中 n 個人身上只有一張一元錢,另外 n 個人身上只有一張兩元錢。我就讓他們排成一隊,然後用這 n 個人的一元錢來找給付兩元的人。當然,排隊的時候得保證每次來一個付兩元的人的時候都有的找。

假設所有拿一元的人和拿兩元的人都沒有分別,我現在想知道,他們有多少種排隊方式?

這個問題的答案大家都知道,是 Cat[n],即第 n 個卡特蘭數(Catalan number)。不過我現在的問題是如下的升級問題。

升級1:條件同上,但這時候來的人數為 3n ,其中 n 個人只有一張一元錢,n 個只有一張兩元錢, n 個只有一張三元錢(假設題設的每種面值的鈔票均存在)。我仍然讓他們排成一隊,只要有付兩元的就用一元找,付三元的就用兩元找。同樣得保證每當需要找錢時有對應的錢可以找。求他們有多少種排隊方式?

以及最終問題

升級2:條件同上,但這時候來的人數為 mn,其中擁有面值為一元至 m 元的人均有 n 個。每當支付 k (技術分享圖片)元時用 k-1 面值的鈔票去找零。求合法排隊方式數。

先看例題:【HihoCoder1480:矩陣填數 】

題意:將N*M個整數填入N*M的矩陣中,要求當前位置的數小於左邊和上面的數,求方案數。

有【鉤子公式】:

對於給定形狀,不同的楊氏矩陣的個數為:n!除以每個格子的鉤子長度加1的積。 其中鉤子長度定義為該格子 右邊的 格子數和 它上邊的格子數之和。

則易得此題公式:

ans=fac[n*m];
for(int i=1;i<=n;i++) 
    
for(int j=1;j<=m;j++){ ans=ans*rev[i+j-1]%Mod; }

【關鍵】:這個矩陣填數和賣奶茶的關系:

加入3*N個人買奶茶: N個一塊錢的+N個兩塊錢+N個三塊錢,給他們的排隊隊伍編號1,2,3 ... 3*N。然後把這3*N個人拿去填充矩陣。

具體的,一塊錢的在第一排,兩塊錢的在第二排,三塊錢的在第三排。 那麽他們必須滿足:先來的在左邊,小面額的在上邊。

即當前位置是數小於上面的和左邊的。這樣以來這個解就可以用鉤子定理來求解了。

此外:

楊氏矩陣還有遞推公式:f[n]=f[n-1]+(n-1)*f[n-2]。

還可以用卡特蘭數表示:第技術分享圖片個卡特蘭數。

【楊氏定理+鉤子公式】初步