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 ;
}
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 ;
}
相关文章推荐
- [ACM] hdu 2048 神、上帝以及老天爷 (错位排列公式)
- [ACM] hdu 2048 神、上帝以及老天爷 (错位排列公式)
- [ACM] hdu 2048 神、上帝以及老天爷 (错位排列公式)
- HDU_2048——全错位排列递推公式
- hdu-2048-神、上帝以及老天爷(错序排列)
- hdoj 2048 神、上帝以及老天爷【全错位排列】【组合数论】
- 【HDU 2048】神、上帝以及老天爷(错位排序)
- HDU_2049——部分错位排列,概率论
- HDU 2048 2049 (错排,排列组合)
- hdu 4996 1~n排列LIS值为k个数
- HDU 1716 排列2
- hdu 2554 每个数字有2个 相同数字k之间有k个数 问这样的排列是否存在 数论!!!
- hdu 2048 神、上帝以及老天爷(水题,递推,错排)
- 【HDU 1716 排列2】+ DFS
- hdu 1427 速算24点(java,DFS,全排列)
- HDU 1716 排列2
- hdu 1716 排列2 输出几个数字的全排列
- HDU 5172 GTY's gay friends 线段树(排列,区间不同的数)
- HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)
- HDU 5651(排列组合,逆元)