hdu1465 不容易系列之一
2015-08-22 22:21
309 查看
Problem Description
大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!
做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。
话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。
不幸的是,这种小概率事件又发生了,而且就在我们身边:
事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!
现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?
Input
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1<n<=20),n表示8006的网友的人数。
Output
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。
Sample Input
Sample Output
大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!
做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。
话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。
不幸的是,这种小概率事件又发生了,而且就在我们身边:
事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!
现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?
Input
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数n(1<n<=20),n表示8006的网友的人数。
Output
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。
Sample Input
2 3
Sample Output
1 2 解题报告: 1、当N=1和2时,易得解,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况: 2、当有N封信的时候,前面N-1封信可以有N-1或者 N-2封错装 3、前者,对于每一种错装,可以从N-1封信中任意取一封和第 N封错装,故=F(N-1) * (N-1) 4、后者简单,只能是没装错的那封信和第N封信交换信封,没装错的那封信可以是前面N-1封信中的任意一个,故= F(N-2) * (N-1) 得到如下递推公式: 基本形式:d[1]=0; d[2]=1 递归式:d = (n-1)*( d[n-1] + d[n-2]) 这就是著名的欧拉全错排公式: f(n)=n!(1-1/1!+1/2!-1/3!+1/4!+...+(-1)^n*1/n!);(n>1)#include <cmath> #include <ctime> #include <cctype> #include <climits> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> #include <set> #include <queue> #include <stack> #include <string> #include <vector> #include <sstream> #include <iostream> #include <algorithm> #define INF (INT_MAX / 10) #define clr(arr, val) memset(arr, val, sizeof(arr)) #define pb push_back #define sz(a) ((int)(a).size()) using namespace std; typedef set<int> si; typedef vector<int> vi; typedef map<int, int> mii; typedef pair<int, int> pii; typedef long long ll; const double esp = 1e-5; #define N 50100 int main() { __int64 arr[21]; int num,i; while(scanf("%d",&num)!=EOF) { arr[1]=0; arr[2]=1; for(i=3;i<21;i++) { arr[i]=(i-1)*(arr[i-1]+arr[i-2]); } printf("%I64d\n",arr[num]); } return 0; }
相关文章推荐
- 多校连萌15-8-12#A
- Unity3D开发——安卓版的虚拟按键实现
- tcp和udp
- 浪潮天梭k1主机并非全是基于安腾cpu的
- TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine
- 引用和指针的区别和联系
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
- Delphi2010中DataSnap技术网摘
- Objective-C 【继承、变量修饰符(私有变量/方法)、description方法】
- LeetCode 29 Divide Two Integers 除法的原理
- R语言_非参数检验
- IOS弹出视图preferredContentSize
- ACM学习历程—HDU5418 Victor and World(动态规划 && 状压)
- 启动tomcat时出现The specified JRE installation does not exist 如何解决?
- 面向对象设计模拟简单ATM系统
- CCActionGird源码分析
- 第91讲:Akka第一个案例动手实战架构设计
- MySql 事务+异常处理+异常抛出
- 个人acm模版
- 基于Spring提供支持不同设备的页面