BZOJ2982——combination
来源:互联网 发布:阿里云电视软件 编辑:程序博客网 时间:2024/05/17 22:12
1、题意:求 C(n,m) % 10007 ,10007是质数咯 n和m < 2000000000
2、分析:这个东西太大了,显然不能用n!的阶乘预处理的方式搞出来,也不能用递推公式搞出来
于是我们直接lucas定理 C(n,m) % MOD = C(n / MOD, m / MOD) * C(n % MOD, m % MOD) % MOD
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define M 10010#define MOD 10007 inline int read(){ char ch = getchar(); int x = 0, f = 1; while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while('0' <= ch && ch <= '9'){ x = x * 10 + ch - '0'; ch = getchar(); } return x * f;} int fac[M], inv[M]; inline void init(){ fac[0] = 1; for(int i = 1; i < MOD; i ++) fac[i] = fac[i - 1] * i % MOD; inv[1] = 1; for(int i = 2; i < MOD; i ++) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD; inv[0] = 1; for(int i = 1; i < MOD; i ++) inv[i] = inv[i] * inv[i - 1] % MOD;} inline int C(int n, int m){ if(n < m){ return 0; } if(n < MOD && m < MOD){ return fac[n] * inv[m] % MOD * inv[n - m] % MOD; } return C(n / MOD, m / MOD) * C(n % MOD, m % MOD) % MOD;} int main(){ int T = read(); init(); while(T --){ int n = read(), m = read(); printf("%d\n", C(n, m)); } return 0;}
0 0
- BZOJ2982——combination
- 【bzoj2982】combination
- BZOJ2982: combination
- [bzoj2982]combination
- BZOJ2982 combination
- bzoj2982 combination
- 【bzoj2982】 combination LUCAS定理
- 【bzoj2982】【combination】【Lucas定理】
- 【lucas定理】BZOJ2982 combination
- BZOJ2982: combination(Lucas定理)
- Lucas定理模板【bzoj2982】【combination】
- bzoj2982: combination 组合数 卢卡斯定理
- [BZOJ2982]combination(组合数学lucas定理)
- 组合数学lucas定理 BZOJ2982 combination
- [bzoj2982]combination(组合数学lucas定理)
- bzoj2982 combination【Lacus定理+线性求逆元】
- 回溯法——combination-sum、combination-sum-ii
- Leetcode题集——combination-sum and combination-sumII
- 如何创建yum本地源?
- 对cell赋值 matlab
- 2016-7-12
- JAVA基础之JAVA概述
- 实例解读AndroidManifest.xml
- BZOJ2982——combination
- html中实现table跨行跨列
- css中绝对定位与相对定位的区别
- 在虚拟机上安装redhat linux
- Android开发——Activity生命周期
- spring核心概念
- 权限管理设计------之数据库设计
- SQL语句---nvl、ifnull 用法(将null转代为0)
- 吐槽吐槽烂代码