hdu6114.Chess(求组合数)
来源:互联网 发布:淘宝iphone可靠商家 编辑:程序博客网 时间:2024/06/04 20:06
题目链接;http://acm.hdu.edu.cn/showproblem.php?pid=6114
求组合数的模版题。(代码也是在网上找的)
(Lucas定理:大整数求组合数取余定理)
Lucas定理用来求C(a,b)mod p的值,其中p为素数。
数学表达式为:
Lucas(a,b,q)=C(a%q,b%q)*Lucas(a/p,b/p,p);
Lucas(a,0,q)=0;
通过这个定理就可以很方便的把大数的组合转化成小数。但其中还是要求C(a%q,b%q)%p,所以这里引入逆元来求。
【定义】若整数a,b,p, 满足a·b≡1(mod p).则称a 为b 模p 的乘法逆元, 即a=b- 1mod p.其中, p 是模数。
应用到组合数中来就是:
a!/[b!(a-b)!] % p == a! [b!*(a-b)!]-1 %p
【逆元求法】:
应用费马小定理,ap-1=1 mod p ,即 a*ap-2=1 mod p
也就是说 ap-2就是a的逆元。
当然这里求出来的逆元是在取模p的逆元,对我们最终目标没有影响。这也是比较方便而且比较好的方法。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;const LL MOD=1000000007;LL n,m;LL quick_mod(LL a, LL b){ LL ans = 1; a %= MOD; while(b) { if(b & 1) { ans = ans * a % MOD; b--; } b >>= 1; a = a * a % MOD; } return ans;}LL C(LL n, LL m){ if(m > n) return 0; LL ans = 1; for(int i=1; i<=m; i++) { LL a = (n + i - m) % MOD; LL b = i % MOD; ans = ans * (a * quick_mod(b, MOD-2) % MOD) % MOD; } return ans;}LL Lucas(LL n, LL m){ if(m == 0) return 1; return C(n % MOD, m % MOD) * Lucas(n / MOD, m / MOD) % MOD;}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%I64d%I64d", &n, &m); if(m > n) { LL a; a = m; m = n; n = a; } printf("%I64d\n", Lucas(n,m)); } return 0;}
阅读全文
0 0
- hdu6114.Chess(求组合数)
- HDU6114 Chess(组合数)
- HDU6114-Chess
- hdu6114 Chess
- hdu4832 Chess(dp+组合数)
- Chess(组合数,逆元)
- HDU 6114 Chess (组合数 思路)
- Chess(组合数公式)
- bzoj 1801: [Ahoi2009]chess 中国象棋 (组合数+DP)
- Codeforces Round #313 (Div. 2) E. Gerald and Giant Chess 定理Lucas求大组合数
- 求组合数(数学)
- 求组合数(模板)
- uva 11538 - Chess Queen(组合数)
- hdu4869(逆元+求组合数)
- HDU2519(求组合数,数据类型坑)
- OJ1100: 求组合数(函数专题)
- hdu 5651 (求回文组合数)
- 1100: 求组合数(函数专题)
- 5.3二叉树的存储结构
- 风格迁移转换的两种实现
- 617. Merge Two Binary Trees(Java)
- revit二次开发之单位转换
- wsdl和wadl区别
- hdu6114.Chess(求组合数)
- Greenplum:ARNING: database "xxxx" must be vacuumed within xxxx transactions,HINT: To avoid a databas
- Android开发-工具类-Tools-获得本周周一到周日日期(可以跨年计算)-AndroidStudio
- 【软件工程】大道至简软件工程读书总结
- sqlldr从服务器上获取txt文件数据导入到数据库
- android 内存进程管理分析
- Linux如何查看用户和进程对内存的使用情况
- Python中unittest 用不同的参数组合,测试同样的行为;使test case根据参数多次运行
- [C#.Net]判断文件是否被占用的两种方法