首页 > 其他分享 >求组合数的几种方法

求组合数的几种方法

时间:2023-03-16 16:37:13浏览次数:33  
标签:infact 组合 int inv 几种 逆元 方法 bmod fact

引入

在做题时,经常会遇到需要计算从 \(n\) 个物品中选择 \(m\) 个的方案数的情况。
我们就需要用到计算组合数的公式:\(\large{C_m^n} = \dfrac{n!}{(n-m)!m!}\)。这篇文章里为了方便,用 \(\dbinom{n}{m}\) 代替 \(\large{C_m^n}\)。

方法

1.乘法逆元

最简单的方法莫过于用组合数公式直接求。

但在 \(21!\) 就已经爆 long long,所以通常是会有模数的。
如果有了模数,那么普通的除法肯定是会出大问题,就又要引入逆元

如果一个线性同余方程 \(ax \equiv 1 \pmod b\) ,则 \(x\) 称为 \(a \bmod b\) 的逆元,记作 \(a^{-1}\) 。

定义 \(fact_n = n!\bmod p\) (\(p\) 为模数),\(infact_n = (n!)^{-1}\bmod p\)。那么我们就可以把原始公式转换成 \(\dbinom{n}{m}=fact_n \cdot infact_{n-m} \cdot infact_m\)。

在这里,求乘法逆元可以用线性递推法 \(inv_i = (p-\lfloor\frac{p}{i}\rfloor)inv_{p\bmod i}\bmod p\)。

const int mod = ...;
int inv[],fact[],infact[];
void init(){
	fact[1]=infact[1]=inv[1]=1;
	for(int i=2;i<=...;i++){
		inv[i]=(mod-mod/i)*inv[mod%i]%mod;
		fact[i]=fact[i-1]*i%mod;
		infact[i]=infact[i-1]*inv[i]%mod;
	}
}
int C(int n,int m){
	return (ll)fact[n]*infact[n-m]%mod*infact[m]%mod;
}

标签:infact,组合,int,inv,几种,逆元,方法,bmod,fact
From: https://www.cnblogs.com/As-Snow/p/17223075.html

相关文章

  • Python中列表去重常用的3种方法!
    在Python中,列表去重的方法有很多种,其中比较常用的方法有3种:1、利用字典的【fromkeys()】和【keys()】方法去重;2、集合的可迭代方法;3、用for循环。这3种方法希望大家可......
  • JSON的常用方法
    1、JSON.parse()JSON.parse()可以将JSON格式的字符串解析或成JS中的对应值       2、JSON.stringify() JSON.stringify()可以将JS的基本数据类型、对......
  • commons-io的Java文件处理常用方法
    Java文件处理常用方法归纳整理一些常用的处理文件的方法JavaApacheFileUtilsMaven依赖引入<dependency><groupId>commons-io</groupId><artif......
  • 三种判断方法
    ifelse:用于两种情况的判断。 if esleif:用于处理多条件的区间性判断,else永远跟离它最近的那个if配对。Console.WriteLine("请输入学员的考试成绩")......
  • Secret的几种类型
    Opaque:通用型Secret,默认类型;kubernetes。io/service-account-token:作用于ServiceAccount,包含一个令牌,用于标识API服务账户;kubernetes。io/dockerconfigison:下载私有仓库......
  • Ubuntu长按shift键开机不能进入grub选项界面的解决方法
    1.长按esc键,进入grub>命令行2.输入normal,按回车键。此时会进入操作系统,需要手动重启。3.重启,长按esc键,有2种情况:(1)直接进入grub选项界面(2) 再次进入grub>命令行,此......
  • Ubuntu忘记密码的解决方法
    1.长按shift键开机2.列表选择"AdvancedoptionsforUbuntu",回车3.列表选择任意一个(recoverymode),按e键进入编辑界面,注意别按回车4.编辑界面找到"rorecoverynomodes......
  • Scrapy中Request对象的属性和方法
    Scrapy中的Request对象是用于表示一个HTTP请求的类。以下是一些常见的属性和方法:属性:url:请求的URL。callback:在响应返回后,将调用的回调函数。method:请求方法,默......
  • 创建configmap的几种方式
    kubectlcreateconfigmap-hkubectlcreatecmcmfromdir--from-file=conf/kubectlcreatecmcmfromfile--from-file=conf/redis.confkubectlcreatecmcmspeci......
  • 类加载器常用方法
    publicclassClassLoaderDemo{publicstaticvoidmain(String[]args)throwsIOException{//staticgetSystemClassLoader():获取系统类加载器......