错排公式

hdu 2048题  有n个人,没人写自己的名字手上,然后随机取,问所有人取得都不是自己的概率是多少?  公式为f(n)=(n-1)*(f(n-1)+f(n-2)) (n>2)  f(1)=0,f(2)=1 fn为错排的次数 然后除以总的取法(n!)即可 

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
while(cin>>n){
int m;
while(n--){
cin>>m;
double p[21];
p[1]=0;
p[2]=1;//次数
for(int i=3;i<=m;i++){
p[i]=(i-1)*(p[i-1]+p[i-2]);//错排公式
}
for(int i=1;i<=m;i++){//次数/总数(m!)=概率
p[m]/=i;
}
cout<<fixed<<setprecision(2)<<p[m]*100<<"%"<<endl;
}
}
return 0;
}

posted @ 2016-12-13 12:54  zzd007  阅读(164)  评论(0)    收藏  举报