首页 > 其他分享 >组合数comb

组合数comb

时间:2023-12-07 18:03:50浏览次数:25  
标签:组合 mathrm int ll fac comb inv mod

递推法

时间复杂度:O(n*m)

const int N=2010;
const int mod=1e9+7;
ll C[N][N];
void init(){
  for(int i=0; i<N; i++) C[i][0] = 1;
  for(int i=1; i<N; i++)
  	for(int j=1; j<=i; j++)
      		C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;  
}

公式法

时间复杂度:O(n)

[公式]

\[\begin{gathered} \mathrm{C}_n^m=\frac{\mathrm{A}_n^m}{\mathrm{A}_m^m}=\frac{n(n-1)(n-2)\cdots(n-m+1)}{m!} =\frac{n!}{m!(n-m)!},\quad n,m\in\mathbb{N}^*,\text{并且}m\leq n \\ \mathrm{C}_n^0=\mathrm{C}_n^n =1 \end{gathered} \]

const int N = 2000010;
const int mod = 1e9 + 7;

ll inv_fac[N], fac[N];
ll qmi(ll a, ll b) {
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
void init() {
    fac[0] = 1;
    for (int i = 1; i < N; i++) {
        fac[i] = fac[i - 1] * i % mod;
    }
    inv_fac[N - 1] = qmi(fac[N - 1], mod - 2);
    for (int i = N - 1; i >= 1; i--) {
        inv_fac[i - 1] = inv_fac[i] * i % mod;
    }
}
ll comb(int n, int k) {
    return fac[n] * inv_fac[k] % mod * inv_fac[n - k] % mod;
}

标签:组合,mathrm,int,ll,fac,comb,inv,mod
From: https://www.cnblogs.com/taotao123456/p/17883566.html

相关文章

  • 测试用例设计方法六脉神剑——第二剑:招式组合,因果判定出世 | 京东物流技术团队
    1引言上篇讲了等价类划分和边界值分析法,而这两种方法只考虑了单个的输入条件,并未考虑输入条件的各种组合、输入条件之间的相互制约关系的场景。基于此短板,因果图法和判定表法应运而生。2因果图法2.1概念及原理2.1.1定义一种描述输入条件的组合以及每种组合对应的输出的图形化工......
  • CSS的逻辑组合伪类
    CSS的逻辑组合伪类有4种,分别是::not()、:is()、:where()和:has()。否定伪类:not():not 伪类选择器用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中,它也被称为反选伪类(negationpseudo-class)。也叫否定伪类,是在元素与括号里面的参数不匹配的时候,就会对这......
  • MFC 组合框 CComboBox
    7)组合框(下拉框)CComboBox a)获取内容:CComboBox::GetLBText 其它接口和CListBox 的用法几乎一样 b)属性设置 1)data:设置内容,不同内容间同英文的分号“;”分隔 2)type//DropDown之类的选项,可编辑和不可编辑。这个和上一个的列表框比较像,差不多。在BOOLCMFCAp......
  • const与指针的组合
    ① constint*p;//指向一个整型常量的指针,p可变,p指向的对象不可变。② intconst*p;//同上。③ int*constp;//p不可变,p指向的对象可变(const修饰的是*),常量指针。④ constint*constp;//p不可变,p指向的对象也不可变。关键点:以*为界,*号左边修饰的是p指向的对象,*号......
  • 预处理组合数
    预处理组合数基本做法针对大多数仅仅是利用组合数求解问题的题目运用递推法打表,不仅方便,而且可以稳稳地控制复杂度,对于需要多次引用组合数的题目效果极佳:基于组合数公理性质:\[C^m_n=C^{n-m}_n\]推得:\[C^m_n=C^{m-1}_{n-1}+C^m_{n-1}\]由这个递推公式就可以熟练的写出组合......
  • XmlRPC入门_基于组合类型的客户端、服务端
    1、客户端#include<stdlib.h>#include<stdio.h>#include<xmlrpc-c/base.h>#include<xmlrpc-c/client.h>#include"config.h"/*informationaboutthisbuildenvironment*/#defineNAME"Xmlrpc-cTestClient"#d......
  • 组合按键移植
    参考gitee移植,key_board:用于单片机中的小巧多功能按键支持;最强功能:支持不限数量、任意按键、任意按键的任意状态之间的随意组合!!!(gitee.com)支持:矩阵键盘单io按键 注:在此没有做矩阵键盘,注意按键的电气属性设置,引脚初始化默认是按键上拉,按下为低电平,要根据实际修改。F103......
  • web前端tips:js继承——寄生组合式继承
    上篇文章给大家分享了js继承中的寄生式继承web前端tips:js继承——寄生式继承今天给大家分享一下js继承中的寄生组合式继承寄生组合式继承寄生组合式继承是一种结合了寄生式继承和组合式继承的方式,它的目标是减少组合式继承中多余的调用父类构造函数的开销。在组合式继承......
  • XmlRPC入门_组合类型操作
    1、数组操作#include<iostream>#include<winsock2.h>#include<windows.h>#include<xmlrpc-c/base.hpp>#include<xmlrpc-c/registry.hpp>#include<xmlrpc-c/server_abyss.hpp>#include<direct.h>#include<stdio.h&......
  • 代码随想训练营第四十四天(Python)| 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
    [完全背包]有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。1、先遍历物品再遍历背包defall_bag(weight,value,bag_weight):dp=[0]*......