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