博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu-1133
阅读量:4451 次
发布时间:2019-06-07

本文共 1372 字,大约阅读时间需要 4 分钟。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133

思路:有m个人拿50元的纸币,n个人拿100元的纸币门票价格是50元,要求每个售票员遇到100元时都能找回顾客50元。

(1)如果m<n就不行,ans=0;

(2)m>=n,总共有C(m+n,n)种可能,只要求出不符合要求的即可。

假如有一个m=3,n=2的序列01100,它不合法,将第二个1后的0变为1,1变为0,得到01111,显然它也不合法。

由此可以看出每一个(m,n)序列都能由(m-1,n+1)序列推过来,所以不合法的序列数总共有C(m+n,m+1)个

,总共合法的序列有C(m+n,n)- C(m+n,m+1)=  (m+n)!*(m-n+1)/(m+1)个。

#include
#include
#include
using namespace std;const int base = 10000;const int maxn = 100;int f[maxn*2][maxn*2],n,m,ans[maxn+20];void mul(int a[],int x){ int i,tmp=0; for(i=maxn-1;i>=0;i--) { tmp+=a[i]*x; a[i]=tmp%base; tmp/=base; }}void chu(int a[],int x){ int i,tmp=0; for(i=0;i<=maxn;i++) { tmp=tmp*base+a[i]; a[i]=tmp/x; tmp%=x; }}void Init(){ f[0][maxn-1]=f[1][maxn-1]=1; for(int i=2;i<=200;i++) { memcpy(f[i],f[i-1],maxn*sizeof(int)); mul(f[i],i); }}int main(void){ int i,j,pt=1; Init(); while(~scanf("%d%d",&m,&n)&&(n+m)) { printf("Test #%d:\n",pt++); if(n>m) { printf("0\n"); continue; } memcpy(ans,f[n+m],maxn*sizeof(int)); mul(ans,m-n+1); chu(ans,m+1); i=0; while(ans[i]==0) i++; printf("%d",ans[i++]); while(i

 

转载于:https://www.cnblogs.com/2018zxy/p/9905997.html

你可能感兴趣的文章
PX4地面站QGroundControl在ubuntu下的安装
查看>>
react实现svg实线、虚线、方形进度条
查看>>
Web
查看>>
那些容易忽略的事(1) -变量与运算符+
查看>>
九度oj 题目1252:回文子串
查看>>
(十一)tina | openwrt关闭调试串口(DEBUG UART)
查看>>
angularjs 使用angular-sortable-view实现拖拽效果(包括拖动完成后的方法使用)
查看>>
2015生命之旅---南京、南通、上海之行
查看>>
高精度练习之乘法(codevs_3117)
查看>>
小Z爱划水
查看>>
Qt Font
查看>>
2014年生日
查看>>
扫描目录下的文件并拼接在一起
查看>>
ELK 分布式日志处理 10.12
查看>>
Java虚拟机详解05----垃圾收集器及GC参数
查看>>
7. 单位,移动布局
查看>>
inux中bin与sbin目录的作用及区别介绍
查看>>
USACO 3.1 Contact
查看>>
Office之什么是高内聚低耦合
查看>>
一些奇怪的问题求回答
查看>>