2049不容易系列之(4)——考新郎
2015-10-05 15:39
323 查看
分析:这个道题就是求N中有多少中M个数的错排。
因此先找到N个新郎中M个错一共有几种,显然是CMN=N!/(M!*(N-M)!)。即CMN=N!/M!/(N-M)!。
然后在求出M个数的错排个数,递推关系:f
=(n-1)*(f[n-1]+f[n-2])
详细推导过程:
错排的情况:
首先考虑,如果开始有n-1个新郎,并且这n-1个人都已经完成了错排(有f(n-1)种可能),现在又来了一个人,那么后来的第n个人可以通过用自己的新娘去和那n-1个人中的任意一个交换,来实现n个人都错排。这种情况有(n-1)*f[n-1]种可能;
另外,如果开始的n-1个人不是都错排,那么要想使第n个人过来与其中一个交换后实现错排的话就必须满足两个条件:
1.那n-1个人中只有一个人选到了自己的新娘,也就是说有n-2个人都已经错排了。
2.第n个人必须和那个选到自己新娘的人去交换,但那个选到自己新娘的人可以是n-1个人中的任意一个。这种情况有(n-1)*f[n-2]种可能。
其他情况都不能满足n个人错排。
因此递推关系:f
=(n-1)*(f[n-1]+f[n-2])。
因此先找到N个新郎中M个错一共有几种,显然是CMN=N!/(M!*(N-M)!)。即CMN=N!/M!/(N-M)!。
然后在求出M个数的错排个数,递推关系:f
=(n-1)*(f[n-1]+f[n-2])
详细推导过程:
错排的情况:
首先考虑,如果开始有n-1个新郎,并且这n-1个人都已经完成了错排(有f(n-1)种可能),现在又来了一个人,那么后来的第n个人可以通过用自己的新娘去和那n-1个人中的任意一个交换,来实现n个人都错排。这种情况有(n-1)*f[n-1]种可能;
另外,如果开始的n-1个人不是都错排,那么要想使第n个人过来与其中一个交换后实现错排的话就必须满足两个条件:
1.那n-1个人中只有一个人选到了自己的新娘,也就是说有n-2个人都已经错排了。
2.第n个人必须和那个选到自己新娘的人去交换,但那个选到自己新娘的人可以是n-1个人中的任意一个。这种情况有(n-1)*f[n-2]种可能。
其他情况都不能满足n个人错排。
因此递推关系:f
=(n-1)*(f[n-1]+f[n-2])。
#include <stdio.h> #include <stdlib.h> __int64 a[21]={1,1,2}; __int64 b[21]={0,0,1}; int main() { int i; for(i=3;i<=21;i++){ a[i]=a[i-1]*i; } for(i=3;i<=21;i++){ b[i]=(b[i-1]+b[i-2])*(i-1); } int c,n,m; while(scanf("%d",&c)!=EOF){ while(c--){ scanf("%d%d",&n,&m); printf("%I64d\n",a /a[m]/a[n-m]*b[m]); } } return 0; }
相关文章推荐
- 各种排序算法的大集合
- 计算1到100之间整数中9出现的次数
- 【教程】用安卓厨房制作你自己的卡刷包!你也可以是Romer !
- 关于以太网网线的总结详细
- java泛型,原始类型和桥方法
- 开始了解窗口程序
- 选择排序
- C++:预处理
- TextView——文本省略显示
- nginx安装部署
- 计算1-1/2+1/3-1/4+.....+1/99-1/100的值
- PAT1015 德才论
- UI_三个UITableView的省市区联动
- ubuntu下使用vi是方向键变乱码退格键不能使用的解决方法(一)
- 黑马程序员----Objective-C学习笔记之构造方法
- 阿里云CentOS下yum安装mysql,jdk以及tomcat
- GDB 资料汇总
- 黑马程序员——6.集合类(String/StringBuffer、List、Set、Map、Collections工具类、Arrays工具类 )
- 转载:TCP超时重传机制探索
- Spark修炼之道(基础篇)——Linux大数据开发基础:第十一节:Shell编程入门(三)