概率论中的组合数应该比较熟悉吧,在数论中组合数也具有重大意义,下面介绍组合数的解法:

方法一O(n^2):

利用公式(n,m)=(n-1,m-1)+(n-1,m):

模板:

#include<cstdio>
const int N = + ;
const int MOD = (int)1e9 + ;
int comb[N][N];//comb[n][m]就是C(n,m)
void init(){
for(int i = ; i < N; i ++){
comb[i][] = comb[i][i] = ;
for(int j = ; j < i; j ++){
comb[i][j] = comb[i-][j] + comb[i-][j-];
comb[i][j] %= MOD;
}
}
}
int main(){
init();
}

方法二(O(n)):

因为大部分题都有求余,所以我们大可利用逆元的原理(没求余的题目,其实你也可以把MOD自己开的大一点,这样一样可以用逆元做)。利用公式:

我们需要求阶乘和逆元阶乘。

模板:

const int MOD = (int)1e9 + ;
int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
void init(){
inv[] = ;
for(int i = ; i < N; i ++){
inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
}
F[] = Finv[] = ;
for(int i = ; i < N; i ++){
F[i] = F[i-] * 1ll * i % MOD;
Finv[i] = Finv[i-] * 1ll * inv[i] % MOD;
}
}
int comb(int n, int m){//comb(n, m)就是C(n, m)
if(m < || m > n) return ;
return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
}
int main(){
init();
}

最新文章

  1. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务
  2. Fragment中添加ListView而不使用ListFragment
  3. 优化MyBatis配置文件中的配置
  4. SQL 中怎么查询一个数据库中一共有多少个表
  5. 【jmeter】属性和变量
  6. C++组合问题
  7. JAVA:避免重复的创建对象
  8. Kendo Web UI Grid里时间格式转换
  9. Erlang虚拟机的启动
  10. Python Web框架篇:Django Model ORM(对象关系映射)
  11. MYSQL:数据库安装 windows
  12. C++顺序容器知识总结
  13. JAVA获取计算机CPU、硬盘、主板、网络等信息
  14. CodePad系列之-Tkinter窗体
  15. 记一次windows服务开发中遇到的问题
  16. CentOS下Crontab安装使用详细说明(转)
  17. Linux进程共享通信 -- mmap实现
  18. getIsDebuggable
  19. sql server 日志文件占用过多空间
  20. 提高你开发效率的十五个 Visual Studio 使用技巧

热门文章

  1. hive 动态分区实现 (hive-1.1.0)
  2. hive-client heap内存大小的配置优先级
  3. ThinkPHP模板内使用U方法
  4. 与前端对接 jsonp
  5. js中实现cookie的增删改查(document.cookie的使用详情)
  6. Shell编程:小白初步
  7. jsp开发环境搭建(windows64位)
  8. Java动态代理的两种实现方法
  9. 转:display:flex不兼容Android、Safari低版本的解决方案 【flex布局】
  10. Hydra密码破译工具