1. 程式人生 > >對錯排認識。

對錯排認識。

  錯排,意思就是原來有一個n個元素的排列,現在要打亂它們的順序,使每個元素都不在原來的位置,一共有多少種可能。

  因為大剛接觸的時候沒聽懂,然後看一個例子後才理解的差不多的,所以我就按放書這個例子來談下。

 

  首先,假設有n本書,我們取一本書,書的編號為m,同時這本書位置也是m,現在,我不能把書放到位置m,只能在剩下的n-1個位置中選擇一個位置,所以錯排運算元有D(n-1)種,現在我們假設將書放在位置k,那麼位置k上的書我們就要拿出來,所以現在我們又要講書k放到其他位置上,而現在問題來了,因為位置m是空的,所以我們有兩種選擇,    第一  :將書k放到位置m上,這樣的話就相當於交換了k和m的位置,那麼,還剩下n-2個位置,就相當於回到原點,重新取書再排列,此時求n-2本的錯排運算元D(n-2),結合第一步,有n-1*(D(n-2))種方法。   第二  :不將書k放到位置嗎m上,我們還要將手裡這本和剩下的n-2本,也就是n-1本,同時又要求手裡這本k還不能放到位置m,這就相當於把手裡這本加上剩下的n-2本也就是n-1本書進行錯排,所以有n-1*(D(n-1))種方法。綜合這兩種情況,最後結果就是n-1*(D(n-2)+D(n-1));

 

 

話不多數,上題!!!

 

國慶期間,省城HZ剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有一個有意思的節目,叫做"考新郎",具體的操作是這樣的:


首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;
然後,讓各位新郎尋找自己的新娘.每人只准找一個,並且不允許多人找一個.
最後,揭開蓋頭,如果找錯了物件就要當眾跪搓衣板...

看來做新郎也不是容易的,假設一共有N對新婚夫婦,其中有M個新郎找錯了新娘,求發生這種情況一共有多少種可能.

Input

輸入資料的第一行是一個整數C,表示測試例項的個數,然後是C行資料,每行包含兩個整數N和M(1<M<=N<=20)。
Output

對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。
Sample Input

2
2 2
3 2

Sample Output

1
3

 

 

 

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long fact[30],num[30];
    int i,n,m,t;
    scanf("%d",&t);
    num[1]=0;
    num[2]=1;
    fact[0]=1;
    fact[1]=1;
    fact[2]=2;
    for(i=3; i<25; i++) {
        num[i] = (i-1)*(num[i-1]+num[i-2]);
    }
    for(i=3; i<25; i++) {
        fact[i] = fact[i-1]*i;
    }
    while(t--){
        scanf("%d%d",&n,&m);
        printf("%lld\n",num[m]*(fact[n]/fact[m]/fact[n-m]));
    }
    return 0;
}

  

  以上表述若有錯誤,歡迎批評指正。。。。。(當然,我也不一定改。、。、)