您的位置:首页 > 其它

hdu(2048)全错位排列

2014-03-04 09:06 190 查看
N张票的全排列为N! 种方式,而第N张票的错排有几种:

1、当前面N-1个人都拿的不是自己的票,而第N个人拿的是自己的票,只需要把自己的票与前面n-1个人中任何一个人交换,就可以形成前N 张票的错排;

2、当前面N-1个人中有一个人拿的是自己的票,而第N个人拿到不是自己的票,只需要把自己的票和那个中奖人的票换一下,就可以形成前N张票的错排,但前N-1个人每个人都有可能拿到自己的票;

综上所述:

f(n) = (n-1) * ( f(n-1)  +  f(n-2) ) ;

#include<iostream>
#include<stdio.h>
using namespace std ;
int main() {
int n ;
while( cin >> n ) {
while(n--) {
int m ;
cin >> m ;
_int64 a[21][2] = {{0,0} , {0,1} , {1,2} , {2,6}};
for( int i = 4 ; i <= m ; i++ ) {
a[i][1] = i * a[i-1][1] ;
a[i][0] = (i - 1) * (a[i-1][0] + a[i-2][0]) ;
}
printf("%.2lf%%\n",(a[m][0]*100.00/a[m][1])) ;
}
}
return 0 ;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: