题目:http://acm.hdu.edu.cn/showproblem.php?pid=2048

看书发现了这道题,刚开始没理解题意,以为是中奖的概率,---> 1/n

后来知道了是典型的错排问题。(后来发现是真的裸)

递推:

Di  为 i个人 的错排数       D1 = 0,  D2 = 1;

第N个人拿了自己的名字,假如前面的N-1个人是错排的,那么第N个人随便找一个人交换就整体满足错排。   N-1(Dn-1)

假如前面的N-1个人里面有一个拿的是自己的票(N-1种可能)剩余的满足错排,那个人和N交换后整体满足错排。 N-1(Dn-2)

所以  Dn = (n-1)*(Dn-1+Dn-2)  

容斥原理也可以推到,但是还没有学习,所以先不写出来了。

AC代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define FO freopen("in.txt", "r", stdin);
#define lowbit(x) (x&-x)
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;
const int inf = 0x3f3f3f3f;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
template <class T>
inline bool scan_d(T &ret)
{
char c; int sgn;
if (c = getchar(), c == EOF) return 0; //EOF
while (c != '-' && (c < '0' || c > '9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
inline void out(int x)
{
if (x > 9) out(x / 10);
putchar(x % 10 + '0');
} ll a[30], sum;
int main() {
a[1] = 0;//1个人的时候,不会出现错排
a[2] = 1;//2个人的时候,只能出现一种错排
rep(i, 3, 25) {
a[i] = (i-1)*(a[i-1]+a[i-2]);//递推关系
}
int _, n;
for(scan_d(_);_;_--) {
scan_d(n);
sum = 1;
rep(i, 1, n+1) {//总的排列数
sum *= i;
}
printf("%.2lf%%\n", a[n]*100.0/sum);
}
}

最新文章

  1. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
  2. JavaSE配置文件java.util.Properties【单例模式Singleton】
  3. C#中数组、ArrayList和List三者的区别
  4. cocos2d win7 安卓环境配置开发
  5. Oracle11g用户密码过期
  6. 使用webview如何做超时判断
  7. javascript类型系统之Array
  8. JavaScript_数组
  9. C++11中int,float,double与string的转化
  10. unity 之2D游戏简单操作
  11. mount CIFS return ERR -12 and report Cannot allocate memory
  12. 如何添加地图控件到Windows Phone 8的页面中
  13. HDU 1003 Max Sum【动态规划求最大子序列和详解 】
  14. PTA 天梯赛练习 7-11 玩转二叉树-二叉树重建
  15. Python datetime模块的介绍
  16. Gnome增加消息提醒extension ( Fedora 28 )
  17. DOM中表格的操作方法总结
  18. 学习ES6的全部特性
  19. prometheus如何使用blackbox-exporter来获取k8s的网络性能
  20. 【转载】CodeIgniter与PHP5.6的兼容问题

热门文章

  1. HDU - 5934
  2. python密钥登录主机
  3. oracle 12c 新特性之不可见字段
  4. Poj 1973 Software Company(二分+并行DP)
  5. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
  6. Ruby中的%表示法
  7. nodejs调用delphi编写的dll
  8. nmap 快速扫描所有端口
  9. maven可用镜像
  10. TCP/IP以及Socket对象基本