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


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

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

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

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

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

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

以及最終問題

升級2:條件同上,但這時候來的人數為 mn,其中擁有面值為一元至 m 元的人均有 n 個。每當支付 k (1<k\leq m)元時用 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]。

還可以用卡特蘭數表示:第(n-1)*(m-1)+1個卡特蘭數。

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM