不容易系列之一(九度教程第 94 题)

时间限制:1 秒 内存限制:128 兆 特殊判题:否

1.题目描述:

大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把 40 个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。不幸的是,这种小概率事件又发生了,而且就在我们身边:事情是这样的——HDU 有个网名叫做 8006 的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给 n 个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!现在的问题是:请大家帮可怜的 8006 同学计算一下,一共有多少种可能的错误方式呢?

输入:
输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正整数 n(1<n<=20), n 表示 8006 的网友的人数。
输出:
对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。

样例输入:
2
3
样例输出:
1
2

2.基本思路

要把所有的信件全都犯错,在数学上,这是一个排列组合的问题(错排)。我们采用如下的步骤进行分析。
符号定义: F ( n ) F(n) F(n)表示 n n n封信全都放错的情况总数。
有 n n n封信 1 , 2 , . . . , k , . . . , n 1,2,...,k,...,n 1,2,...,k,...,n,其对应的信封为 L 1 , L 2 , . . . , L k , . . . , L n L_1,L_2,...,L_k,...,L_n L1​,L2​,...,Lk​,...,Ln​
现在考虑将第n封信加入到信件的集合中:
存在以下两种情况:
将第n封信放在 L k L_k Lk​中,且将第k封信放在了 L n L_n Ln​中那么此时只需要对剩余的 n − 2 n-2 n−2封信及其他们刚好对应的 n − 2 n-2 n−2个信封进行错排即可对应 F ( n − 2 ) F(n-2) F(n−2),又因为第 k k k封是在 n − 1 n-1 n−1封信中挑选出来的有 n − 1 n-1 n−1种可能性,所以①对应的情况总数为 ( n − 1 ) ∗ F ( n − 2 ) (n-1)*F(n-2) (n−1)∗F(n−2) .
将第n封信放在 L k L_k Lk​中,但第k封信没有放在 L n L_n Ln​中。也就是说,第k封信不能放在 L n L_n Ln​当中,那么其实在剩余的n-1封信中其实可以把 L n L_n Ln​等价为 L k L_k Lk​ ,因为对于 L n L_n Ln​的约束只有第k封信不能放进去,那么对于剩余的n-1封信其实就可以将问题等价转化为有n-1封信: 1 , 2 , . . . k , . . . , n − 1 1,2,...k,...,n-1 1,2,...k,...,n−1,和n-1个信封: L 1 , L 2 , . . . , L k , . . . L n − 1 L_1,L_2,...,L_k,...L_{n-1} L1​,L2​,...,Lk​,...Ln−1​。那么对这n-1封信进行错排就会有F(n-1)种情况,和之前一样第 k k k封是在 n − 1 n-1 n−1封信中挑选出来的有 n − 1 n-1 n−1种可能性,所以②对应的情况总数为 ( n − 1 ) ∗ F ( n − 1 ) (n-1)*F(n-1) (n−1)∗F(n−1) .
所以综上所述:可以等到如下递推方程:
F ( n ) = ( n − 1 ) ∗ F ( n − 1 ) + ( n − 1 ) ∗ F ( n − 2 ) F(n)=(n-1)*F(n-1)+(n-1)*F(n-2) F(n)=(n−1)∗F(n−1)+(n−1)∗F(n−2)
以上就是数学上常说的错排公式。
那么有了如上的递推方程,我们就可以采用递归/迭代的方式进行求解。这里推荐采用迭代的方式,因为如果采用递归的话,子问题F(n-1)和F(n-2)的求解会存在大量重复的子问题,导致大量重复的计算,当递归的层数变深之后效率就会变得十分低下。
还有一个需要注意的细节就是该题中N的取值范围为{N|1≤N≤20,N∈Z},而F(20)不在int类型的范围内,需要采用long long类型才会导致结果不会溢出。

3.代码实现

#include <iostream>using namespace std;//F(n)=(n-1)*F(n-1)+(n-1)F(n-2)long long F_recursive(int n){//采用递归的方式进行求解if(n==1)return 0;if(n==2)return 1;elsereturn (n-1)*F_recursive(n-1)+(n-1)*F_recursive(n-2);
}long long F_iterator(int n){//采用迭代的方式进行求解long long a,b,c;if(n==1)return 0;if(n==2)return 1;else{a=0,b=1;for(int i=3;i<=n;i++){c=(i-1)*(a+b);a=b;b=c;}return c;}
}
int main()
{int N;while(scanf("%d",&N)!=EOF){printf("%lld\n",F_iterator(N));}return 0;
}
/*
样例输入:
2
3
样例输出:
1
2
*/

不容易系列之一(九度教程第 94 题)相关推荐

  1. Piggy-Bank - 九度教程第 102 题

    Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...

  2. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  3. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  4. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  5. 成绩排序 九度教程c语言,九度OJ 1089 数字反转

    题目分析: 使用队列存放每一位的数字,然后输出并计算得到反转数值,从而实现数字反转. 源代码: [cpp] #include #include using namespace std; int mai ...

  6. 九度oj 第1题 二维数组中的查找 何海涛:《剑指Offer:名企面试官精讲典型编程题》

    一.题目信息 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: ...

  7. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  8. FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比

    FPGA 之 SOPC 系列(九)SOPC 补充:altera与xilinx对比 今天给大侠带来今天带来FPGA 之 SOPC 系列第九篇,同时也是最后一篇,SOPC 补充:altera与xilinx ...

  9. java-web系列(九)---SpringBoot整合ElasticSearch

    前言 这个项目的github地址:extensible项目的github地址 extensible项目当前功能模块如下: java-web系列(一)-搭建一个基于SSM框架的java-web项目 ja ...

最新文章

  1. jdbc 获取mysql表注释_jdbc读取数据库,表相关信息(含注释)
  2. Web前端基础——HTML
  3. Alpha冲刺Day5
  4. 【翻译】ANDROID KTX – 使用Kotlin进行Android开发
  5. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
  6. 软件开发者只要会敲代码就可以了?
  7. 应用程序无法正常启动0xc0150002
  8. 对PHP中GD库的一些画图函数、及函数参数的学习总结(一)
  9. 期货基础知识(竞价,定价,保证金计算)
  10. stm32f407的串口通信传输不了且串口调试软件无法显示的问题
  11. 【PTA-python】第7章-1 词频统计 (30 分)--sys.stdin.read()读入到特定字符截至,双重排序条件key=lambda item:(-item[1], item[0])
  12. 小扎不要「脸」了?Facebook正式改名Meta!买它,满仓元宇宙
  13. 前端基础第三天项目 大事件后台管理系统
  14. 构造二叉树-前序遍历
  15. 服务器响应程序,封装高可复用的服务端响应SSC程序修复对象 --ServerResponse
  16. erfc函数、persistent、turbo码
  17. 天才少年熊罗源(Alex Xiong),在美职场搅动风云
  18. MATLAB微分方程学习总结
  19. 阿里开源工具——故障在线诊断Arthas
  20. word转换成pdf后乱码怎么办

热门文章

  1. 【Qt+FFmpeg】FFmpeg解码本地视频流程
  2. 建筑工程项目财务管理风险及防控浅析
  3. GitHub Pages 绑定域名
  4. LINUX下在线音乐任意听firefox+totem-xine+mediawrap
  5. 如何制作优质的电商网站帮助中心,为企业客服人员节省60%的咨询工作量
  6. iphone12promax绿屏怎么办
  7. 【从零开始学爬虫】采集亚马逊商品信息
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java绘本馆管理系统n5wn5
  9. 一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官(Spring Boot知识点+详解)
  10. uniapp H5+锁定和解除锁定屏幕方向及关闭应用启动界面及页面刷新