HDU 不容易系列之 4 考新郎

2021-07-03 01:40:29 字數 1215 閱讀 2757

思路:

先找到n個新郎中m個錯一共有幾種,顯然是cm

n=n!/(m!*(n-m)!)。即cm

n=n!/m!/(n-m)!。

然後在求出m個數的錯排個數,遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])

錯排:•第一種情況:如果開始有n-1個人都已經完成了錯排(有f(n-1)種可能),第n個人可以通過用自己的新娘去和那n-1個人中的任意乙個交換,來實現n個人都錯排。這種情況有(n-1)*f[n-1]種可能;

第二種情況:如果開始的n-1個人不是都錯排,那麼要想使第n個人與其中乙個交換後實現錯排的話就必須滿足兩個條件:

1.那n-1個人中只有乙個人選到了自己的新娘,也就是說有n-2個人都已經錯排了。

2.第n個人必須和那個選到自己新娘的人去交換,但那個選到自己新娘的人可以是n-1個人中的任意乙個。這種情況有(n-

1)*f[n-2]種可能。

其他情況都不能滿足n個人錯排。

因此遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])

**:#include using namespace std;

int main()

{ int t,n,m,i;

long long a[25],b[25];//測試邊界資料可以發現資料較大要用longlong或者__int64 ,a[25]陣列儲存階乘用來做組合運算,b[25]儲存錯排的情況

a[0] = 1; a[1] = 1,a[2] = 2;

for(i = 3; i < 21;i++)

a[i] = a[i-1]*i;

b[0] = 0;b[1] = 1;b[2] = 1,b[3] = 2;//之前推導的公式是從m=3開始的

for(i = 4; i < 21;i++)

b[i] = (i-1)*(b[i-1]+b[i-2]);

cin>>t;

while(t--)

{cin>>n>>m;

cout<

不容易系列之 4 考新郎

題目描述 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...

不容易系列之 4 考新郎

國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開蓋頭,如果...

不容易系列之 4 考新郎

國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開蓋頭,如果...