題目鏈接:神、上帝以及老天爺
AC代碼:
#include<iostream>
#include<iomanip>
using namespace std;
typedef long long ll;
double fun (int m)
{
ll a[25],b[25];
a[0]=0;a[1]=0;a[2]=1;a[3]=2;
for(int i=4;i<25;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);
b[0]=0;b[1]=1;
for(int i=2;i<25;i++)
b[i]=b[i-1]*i;
return (double)a[m]/b[m];
}
int main()
{
int t;
cin>>t;
while(t--)
{
int m;
cin>>m;
double sum;
sum=fun(m)*100;
cout<<fixed<<showpoint<<setprecision(2);
cout<<sum<<"%"<<endl;
}
return 0;
}
錯排:
n個有序的元素應有n!個不同的排列,如若一個排列使得所有的元素不在原來的位置上,則稱這個排列爲錯排;有的叫重排。
如,1 2的錯排是唯一的,即2 1。1 2 3的錯排有31 2,2 3 1。這二者可以看作是1 2錯排,3分別與1、2換位而得的。
目錄
基本信息
錯排問題是組合數學發展史上的一個重要問題,錯排數也是一項重要的數。令
是
的一個錯排,如果每個元素都不在其對應下標的位置上,即
,那麼這種排列稱爲錯位排列,或錯排、重排(Derangement)。
我們從分析1 2 3 4的錯排開始:
1 2 3 4的錯排有:
4 3 2 1,4 1 2 3,4 3 1 2,
3 4 1 2,3 4 2 1,2 4 1 3,
2 1 4 3,3 1 4 2,2 3 4 1。
第一列是4分別與123互換位置,其餘兩個元素錯排。
1 2 3 4->4 3 2 1,
1 2 3 4->3 4 1 2,
1 2 3 4-> 2 1 4 3
第2列是4分別與312(123的一個錯排)的每一個數互換
3 1 2 4->4 1 2 3,
3 1 2 4->3 4 2 1,
3 1 2 4->3 1 4 2
第三列則是由另一個錯排231和4換位而得到
2 3 1 4->4 3 1 2,
2 3 1 4->2 4 1 3,
2 3 1 4->2 3 4 1
上面的分析結果,實際上是給出一種產生錯排的結果。
錯排公式
遞推關係
爲求其遞推關係,分兩步走:
第一步,考慮第n個元素,把它放在某一個位置,比如位置k,一共有n-1种放法;
第二步,考慮第k個元素,這時有兩種情況:(1)把它放到位置n,那麼對於除n以外的n-1個元素,由於第k個元素放到了位置n,所以剩下n-2個元素的錯排即可,有
种放法;(2)第k個元素不放到位置n,這時對於這n-1個元素的錯排,有
种放法。
根據乘法和加法法則,綜上得到
特殊地,
。此外,存在
因此,
。
通項公式求解
下面利用遞推關係證明通項公式,可利用母函數方法,也可利用容斥原理。首先基於母函數方法進行證明,令
有遞推關係得
因此
,
,
而1/(1-x)可以替換成無窮級數(無窮遞縮等比數列)
故(由對應次數項係數相等)
此外,也可基於容斥原理進行證明。設
爲數i在第i爲上的全體排列,
。則有
故每個元素都不在原來的位置上的排列數爲
下面是一個實例解析:
希望可以幫到你!