hud 1465、2049、2045 (递推)[含简单C(n,m) n!的写法]
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
System Crawler (2016-03-11)
Description
做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。
话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。
不幸的是,这种小概率事件又发生了,而且就在我们身边:
事情是这样的――HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!
现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?
Input
Output
Sample Input
3
Sample Output
2
#include<stdio.h>
#include<iostream>
using namespace std; __int64 nn (int x)
{
if(x == )return ;
return x * nn(x-);
} __int64 Cmn(int m, int n)
{
if(m < n || n < ) return ;
if(m == n || n == ) return ;
return (Cmn(m-, n-) + Cmn(m-, n));
} int main()
{
__int64 a, f[],sum;
f[] = ;
f[] = ;
//f[3] = 2;
//f[4] = 9;
for(int i = ; i < ; i++)
{
sum = ;
for(int j = ; j < i-; j++)
sum += Cmn(i,j)*f[i-j];
sum += ;
f[i] = nn(i)-sum;
}
while(cin>>a)
{
cout<<f[a]<<endl;
}
return ;
}
然而大家都是这么做的, 理解一下就是, n的全错排等于两种情况的加和, 前n-1的所有排列方式, 其中 n-1 这个有排错了和没排错两种: 如果派错了 即前n-1的是全错排,第n个和前面任意一个交换, 这样就有n-1*f[n-1]种, 如果n-1没排错, 那是前n-2的全错排,第n个和n-1个交换.
#include<stdio.h>
#include<iostream>
using namespace std; int main()
{
__int64 a, f[],sum;
f[] = ;
f[] = ;
for(int i = ; i < ; i++)
{
f[i] = (i-)*(f[i-] + f[i-]);
}
while(cin>>a)
{
cout<<f[a]<<endl;
}
return ;
}
这种分n-1和n-2来讨论的思想, 2045题也用到
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
System Crawler (2016-03-09)
Description
首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.
最后,揭开盖头,如果找错了对象就要当众跪搓衣板...
看来做新郎也不是容易的事情...
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
Input
Output
Sample Input
2 2
3 2
Sample Output
3
#include<stdio.h>
#include<iostream> using namespace std; __int64 Cnm(int n, int m)
{
if(m == n || m == ) return ;
return (Cnm(n-, m-) + Cnm(n-, m));
} int main()
{
__int64 a, f[],sum;
f[] = ;
f[] = ;
for(int i = ; i < ; i++)
{
f[i] = (i-)*(f[i-] + f[i-]);
}
int T;cin>>T;
while(T--)
{
int n,m;
while(cin>>n>>m)
{
cout<<f[m]*Cnm(n,m)<<endl;
}
} return ;
}
但是还可以再优化一下, 针对Cmn用的是递归, 可以改成循环并且打表
先复习一下排列组合公式 

#include<stdio.h>
#include<iostream> using namespace std; int main()
{
__int64 a, f[],sum, N[];
f[] = ;
f[] = ;
N[] = ;
N[] = ;
N[] = ;
for(int i = ; i < ; i++)
{
f[i] = (i-)*(f[i-] + f[i-]);
N[i] = N[i-]*i;
}
int T;cin>>T;
while(T--)
{
int n,m;
while(cin>>n>>m)
{
cout<< N[n]/(N[m]*N[n-m]) * f[m]<<endl;
//注意这里不能写成 f[m] * N[n]/(N[m]*N[n-m]) 会WA
//原因可能是前面f[m] * N[n] 乘爆了
}
} return ;
}
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
System Crawler (2016-03-10)
Description
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
Input
Output
Sample Input
2
Sample Output
6
直接上代码
#include<stdio.h>
#include<iostream>
using namespace std; __int64 f[M]; int main()
{
int n;
f[] = ;
f[] = ;
f[] = ;
for(int i = ; i<; i++)
{
f[i] = f[i-] +f[i-]*;
}
while(cin>>n)
{
cout<<f[n]<<endl;
}
return ;
}
hud 1465、2049、2045 (递推)[含简单C(n,m) n!的写法]的更多相关文章
- P1002 过河卒 【递推、简单动规】
题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒 ...
- hdu 2045 递推
从n>=4开始考虑,只考虑n-1和1的颜色是否相等情况.推出公式F(n)=F(n-1)+2*F(n-2) AC代码: #include<cstdio> const int maxn= ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- 02python算法-递推
递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3 ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- HDU 2049 不容易系列之(4)——考新郎 (递推,含Cmn公式)
不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 1465:不容易系列之一(递推入门题)
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Flags-Ural1225简单递推
Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...
随机推荐
- gg mirror
https://gufen.ga/ (无广告,原guso.ml,ggso.ga,guge.ga) https://a.aiguso.tk (无广告,体验良好) https://a.freedo.gq/ ...
- C# 导出Excel的示例
Excel知识点. 一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用,它的默认路径是C:\Program Files\Microsoft Visual S ...
- 用openrowset函数操作远程数据库
OPENROWSET 包含访问 OLE DB 数据源中的远程数据所需的全部连接信息.当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的.特殊的 ...
- WordPress实现前台登录功能
一.添加登录表单 1.首先在当前主题的目录下新建一个php文件,命名为page-login.php,然后将page.php中的所有代码复制到page-login.php中: 2.删除page-logi ...
- Python --写excel
# -*- coding: UTF-8 -*- import xlwt import StringIO # 将数据保存成excel def write_data(data, tname): file ...
- HDU-1532 Drainage Ditches,人生第一道网络流!
Drainage Ditches 自己拉的专题里面没有这题,网上找博客学习网络流的时候看到闯亮学长的博客然后看到这个网络流入门题!随手一敲WA了几发看讨论区才发现坑点! 本题采用的是Edmonds-K ...
- 11g自动分区超过最大限制
公司业务系统一张表按时间每天分区 写入数据时报错:ORA-14300: 分区关键字映射到超出允许的最大分区数的分区 ORA-14300: partitioning key maps to a part ...
- Office 中的各种小tips(更新中)
1.Word 中打字输入会擦掉之后原有字符,出现“吃字”的情况? 要将“改写”切换为“插入”,最简单的方法就是点击键盘上小键盘旁边的“insert”键. 其实仔细观察的话,在word文档下方,会看到如 ...
- Garbage First介绍
本文摘自<构建高性能的大型分布式Java应用>一书,Garbage First简称G1,它的目标是要做到尽量减少GC所导致的应用暂停的时间,让应用达到准实时的效果,同时保持JVM堆空间的利 ...
- robotframework安装和配置【转IBM:https://www.ibm.com/developerworks/cn/opensource/os-cn-robot-framework/index.html】
内容 概览 Robot Framework 介绍 Robot Framework 的安装和配置 RIDE 编辑器介绍 创建测试项目 简单的测试用例的编写 总结 相关主题 评论 Robot Fr ...