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

方法一O(n^2):

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

模板:

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

方法二(O(n)):

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

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

模板:

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

转载于:https://www.cnblogs.com/FrankChen831X/p/10665895.html

求组合数的O(n^2)和O(n)解法及模板相关推荐

  1. 算法刷题-数论-组合数、快速幂、逆元、递推求组合数、逆元求组合数

    文章目录 acwing885. 求组合数 I(递推:数据范围:2000) acwing875. 快速幂(a的k次方 模 b) acwing876. 快速幂求逆元 acwing886. 求组合数 II( ...

  2. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  3. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  4. 1100: 求组合数(函数专题)

    1100: 求组合数(函数专题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 6264 解决: 4653 [提交] [状态] [讨论版] [命题人:admin] 题目描述 马上要举办新生 ...

  5. ZZULIOJ 1100: 求组合数(函数专题)

    求组合数(函数专题) 题目描述 马上要举办新生程序设计竞赛了,与以往不同的是,本次比赛以班为单位,为了全面衡量一个班级的整体水平,要求从一个班的m位同学中任选k位同学代表本班参加比赛,问有多少种组合方 ...

  6. java实现n选m组合数_求组合数m_n

    下面为求取组合数的代码: 1 #include #define MAX 10009 int prime[168]; void print(int *v, int length) { int i = 0 ...

  7. 求组合数(完善中.......)

    1.杨辉三角递推法 void init_trangle() {for(int i = 0; i < 500; i ++){cc[i][0] = cc[i][i] = 1;for(int j = ...

  8. 求组合数(不同类型的组合数C++)

    求组合数有许多种不同的算法,要根据不同的数据量大小选择不同的算法 类型1 给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cba mod(109+7)的值. 输入格式 第一行包含整数 n. ...

  9. 数学知识—不同数据范围求组合数,例题、思路、代码实现

    求组合数1: 题目链接:885. 求组合数 I - AcWing题库 题面: 第一行包含整数 n. 接下来 n 行,每行包含一组 a 和 b. 1<=n<=10000 1<=b< ...

最新文章

  1. 我看UNIX与Windows的本质区别
  2. JQuery-学习笔记03【基础——DOM操作】
  3. 滴滴java开发面试题_Java开发经典面试题(十二)
  4. oracle19c的版本号_升级到 oracle 19c 的版本差异
  5. webApplicationContext 与servletContext
  6. SAS9.3安装经验
  7. 数据库系统概论-数据库编程与关系查询处理和查询优化
  8. cad隐藏图层命令快捷键_CAD中,有没有快速隐藏其他图层的快捷键啊? 新上
  9. js 实现简繁体互相转换(字符串)
  10. 跨页面的多选功能实现
  11. 什么是进程、线程、协程
  12. linux打开文件夹
  13. mac电脑安装nvm及使用的详细步骤
  14. 全球最大同性交友平台的“黑历史”
  15. 李兴华java开发实战经典-枚举
  16. 火鸟字幕合并器官方发布首页
  17. Windows App开发之使用通知与动态磁贴
  18. Windows本地认证和NTLM认证
  19. php访问参数错误,提示“无法访问参数错误”的4种解决方法
  20. 知乎万人点赞推荐的五款APP

热门文章

  1. 如何调试NativeSample
  2. DropDownList的常用属性和事件
  3. windowbuilder点击按钮出现新界面_MIUI 10 负一屏,新界面新体验
  4. 广度优先遍历二叉树(BFS)-C++实现
  5. 计算机网络工程实验分析与体会_《软件工程》面向对象分析实验
  6. ubuntu mysql 更新_数据库应用(三): Ubuntu 下 MySQL添加、更新与删除数据
  7. 不同制式字符串之间的转换
  8. php320,PHP_PHP正式版-320mp3下载站
  9. false shell 判断_Shell 流程控制
  10. web开发入门到深入-html5(2)