hdu 1133 Buy the Ticket (高精乘法,不需高精除法)
2015-08-04 23:50
369 查看
原题链接:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=3&problemid=6
在看过网上的很多解答后,感觉大同小异。
我的做法:
1.不需要开二维数组。
2.不需要高精除法 (n!=0时,必定有m+1<=m+n)
3.不需要memcpy函数
分析:
1.n>m 很明显0种情况
2.直接求有多少正确的不同的队列数是比较难的。
所以利用 全部的情况-错误的情况 求得。
C(m+n,n)全部的情况,从m+n个位置选取n个位置为100元的。
C(m+n,m+1)错误的情况,从m+n个位置选取m+1个位置为100元的。
所以公式为(C(m+n,n)-C(m+n,m+1))*(m!)*(n!)
化简得:(m+n)!*( (m-n+1) / (m+1) )
代码如下:
在看过网上的很多解答后,感觉大同小异。
我的做法:
1.不需要开二维数组。
2.不需要高精除法 (n!=0时,必定有m+1<=m+n)
3.不需要memcpy函数
分析:
1.n>m 很明显0种情况
2.直接求有多少正确的不同的队列数是比较难的。
所以利用 全部的情况-错误的情况 求得。
C(m+n,n)全部的情况,从m+n个位置选取n个位置为100元的。
C(m+n,m+1)错误的情况,从m+n个位置选取m+1个位置为100元的。
所以公式为(C(m+n,n)-C(m+n,m+1))*(m!)*(n!)
化简得:(m+n)!*( (m-n+1) / (m+1) )
代码如下:
#include<iostream> #include<string> #include<cstring> #include<cstdio> using namespace std; const int base = 10000; int BigInt[100]; void BigMul(int b) { int temp = 0; for (int i = 99; i >= 0; i--) { temp += BigInt[i] * b ; BigInt[i] = temp%base; temp /= base; } } void JC(int n, int fm) { for (int i = n; i >= 2; i--) { if (i!=fm) //分母为m+1 n!=0时,必定有 m+1<=m+n 所以在相乘时直接约去。 BigMul(i); } } int main() { int n, m, k = 0; while (cin >> m >> n && (n || m)) { memset(BigInt, 0, sizeof(BigInt)); BigInt[99] = 1; //别忘了!!! cout << "Test #" << ++k << ":\n"; if (n > m) { cout << 0 << endl; continue; } if (n != 0) { BigMul(m - n + 1); JC(m + n, m + 1); } else //n为0的情况 { JC(m, 0); } int j = 0; while (!BigInt[j])j++; //去掉前面的0 printf("%d", BigInt[j++]); //最高位不需要补齐4位 while (j<=99) { printf("%04d", BigInt[j]); j++; } cout << endl; } return 0; }
相关文章推荐
- 微信公众号开发学习
- 类似百度搜索后分页的实现
- js改变html的原有内容
- Ext通过按钮创建一个Window实例代码
- HDU 1181 变形课
- 2015/8/4 告别飞思卡尔,抛下包袱上路
- 二分(二分答案、二分搜索)与单调性
- JS数组JSON处理心得
- 链表操作
- HDU 4707 Pet(邻接表dfs)
- nrm —— 快速切换 NPM 源 (附带测速功能)
- nginx源码分析1———进程间的通信机制五(文件锁)
- ListView中有EditText的一些bug的解决方案
- Linux Shell脚本攻略复习
- HDU 5344 MZL's xor (水题)
- IIS下安装PHP
- 谈谈openstack部署规模问题
- 理解MYSQL语句执行过程
- 信号量、互斥体和自旋锁小结
- eclipse 常用设置,常用快捷键修改