首页 > 其他分享 >组合数学学习/复习笔记

组合数学学习/复习笔记

时间:2023-10-07 09:04:47浏览次数:39  
标签:复习 求解 pmod 质数 long cdot 逆元 数学 笔记

模板

(前置芝士)

P1226 【模板】快速幂 | 取余运算

目的:

顾名思义,快速求解乘方。

实现:

挺好写的。

题目传送门

代码


P3811 【模板】乘法逆元

开long long!!

定义:

若 \(a * x\equiv1\pmod b\) ,且 \(a\) 与 \(b\) 互质,那么就能定义 \(x\) 是 \(a\) 在模 \(p\) 意义下的逆元,记为 \(a^{-1}\) 。

其实就是若一个数在模 \(p\) 意义下,

原来我不理解的地方是为什么一个整数的逆元为什么也是整数,当时是因为忽视了是在模 \(p\) 意义下的。在听了正睿的网课后又有了更深一步的理解,可以用群论证明。

目的:

一般用于求 \(\frac{a}{b} \pmod p\) 的值( \(p\) 通常为质数),是解决模意义下分数数值的必要手段。

实现:
  1. 显然的,既然是求解 \(a * x\equiv1\pmod b\) 这个式子,那么就可以用扩展欧几里得求解。可以用于求解模数 \(p\) 很大或者 \(p\) 不是质数时的逆元。

代码


  1. 可以用费马小定理借助快速幂求解

若 \(p\) 为质数,\(a\) 为正整数,且 \(a\) , \(p\) 互质。则有 \(a^{p-1}\equiv1\pmod p\) 。

既然 \(a^{p-1}\) 在模 \(p\) 意义下等于 \(1\),那显然 \(a \times a^{p-2} \equiv1\pmod p\) ,所以 \(a^{p-2}\) 是 \(a\) 的逆元。那么就可以用快速幂求解,需要的注意的是 \(p\) 必须为质数。

代码


  1. 对于 \(1\) ~ \(n\) 内所有数的逆,可以用递推法线性求解。

    首先无论模数 \(p\) 为何值,\(i=1\) 的逆都为 \(1\)。下面求 \(i>1\) 时的逆。

    1. 设 \(p/i=k\),余数是 \(r\)。则有 \(k \cdot i+r \equiv0\pmod p\)。

    2. 两边同乘 \(i^{-1} \cdot r^{-1}\),得到 \(k \cdot r^{-1}+i^{-1}\equiv0\pmod p\)

    3. 由于要求的是 \(i^{-1}\) 所以移项,得到 \(i^{-1}\equiv -k \cdot r^{-1} \pmod p\),即 \(i^{-1}\equiv -p/i \cdot r^{-1} \pmod p\)。

    4. 但到这里还没结束,为了保证 \(i^{-1}>0\) 所以在等式右边加上 \(p\)
      ,由于 \(p \mod p=0\),所以答案不变。得到 \(i^{-1}\equiv (p-p/i) \cdot r^{-1} \pmod p\),即 inv[i]=(p-p/i)*inv[p%i]%p;

代码


  1. 可以用递推线性计算出 \(1\) ~ \(n\) 的阶乘的逆。

首先需要先单独计算出 \(n\) 的阶乘的逆。那么\((n-1)!^{-1}=n!^{-1} \times n\),即 fnv[i-1]=fnv[i]*1ll*i%p;

代码


求组合数

目的:

求 \(C_n^m\),首先先预处理 \(1\) ~ \(n\) 的阶乘和阶乘的逆,然后根据公式 \(C_n^m=\frac{n!}{m!(n-m)!}\) 求解即可。需要提前判断一下 \(n\) 是否小于 \(m\), 若小于则返回 \(0\)。

实现:

代码:

long long ksm(long long a,int b)
{
	long long ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=(a*ans)%p;
		}
		a=(1ll*a*a)%p;
		b>>=1;
	}
	return ans;
}
void init()
{
	fac[0]=1;
	for(int i=1;i<=n;i++)
	{
		fac[i]=fac[i-1]*1ll*i%p;
	}
	fnv[n]=ksm(fac[n],p-2);
	for(int i=n;i>0;i--)
	{
		fnv[i-1]=fnv[i]*1ll*i%p;
	}
}
long long C(int nn,int mm)
{
	if(nn<mm) return 0;
	return ((fac[nn]*fnv[mm])%p)*fnv[nn-mm]%p;
} 

二项式定理

目的:

求解形如 \((x+y)^n\) 的式子。

实现:

利用公式 \((a+b)^n=\sum_{i=0}^n\binom{n}{i}a^{n-i}b^i\) 计算。

标签:复习,求解,pmod,质数,long,cdot,逆元,数学,笔记
From: https://www.cnblogs.com/yzxgg/p/combinatorics.html

相关文章

  • 【学习笔记】(13) 平衡树——记住不的板子
    TreapSplay无旋Treap——fhqtreap简介就是没有旋转操作的Treap,一些性质什么的都跟Treap类似。算法介绍(1)merge(x,y)将两棵“有序”(x中元素的权值最大值小于y中元素权值最小值)的Treap合并成一棵。intch[N][2],sz[N],pri[N],val[N];//val为权值,pri为优先级,sz......
  • 虚树 学习笔记
    2023/10/6发现找不到题做了,决定学习新算法。经过在一些题单中的翻找,决定学习虚树。Part1.引入以一道例题来引入虚树吧。[HEOI2014]大工程给定一棵有\(n\)个点的树,边权均为\(1\)。现在有\(q\)次询问。每次询问取\(k\)个点出来建立完全图。定义连接两个点的代价为......
  • 国庆笔记
    1、 快的保护慢的:比如使用guava保护redis,使用redis保护mysql。人多力量大(集群):一个Mysql不行,就分库分表;一个redis不行,就redis集群;主不行,从可以帮忙扛读流量;尽可能懒:能一会做,就别现在做,能异步就别同步;比如读集群通过异步推送数据,能接受一定时延,就不同步。 https://ju......
  • RK3588开发笔记(一):基于方案商提供的宿主机交叉编译Qt5.12.10
    前言  rk3588开发车机,方案上提供的宿主机只是编译rksdk的版本,并未编译好Qt,那么需要自行交叉编译Qt系统。选择的Qt的版本为5.12.10。 宿主机准备  下载并打开宿主机,只有sdk,并没有交叉编译的Qt。   Qt准备  下载Qt5.12.10的开源软件(方案商提供)。  ......
  • openGauss学习笔记-91 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-M
    openGauss学习笔记-91openGauss数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT外部支持工具为了支持MOT,修改了以下外部openGauss工具。请确保使用的工具是最新版本。下面将介绍与MOT相关的用法。有关这些工具及其使用方法的完整说明,请参阅《工具与命令参考》。91......
  • U9C学习笔记
    建立物料清单BOM时,必须钩选“主批量“,否则建好之后重新再打开窗体,建好的树型BOM会断层。建立完之后,必须每一层物料都全部审核,否则MPS计算时无法展开多阶物料。  MPS计算完成之后,在”计划者工作台“可以查看到”结束净算“,说明已计算完成。 MPS计算时查看错误日志。......
  • 软件设计开发笔记6:基于QT的Modbus RTU从站
      Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。作为一种主从协议,在上一篇我们实现了MobusRTU主站工具,接下来这一篇中我们将简单实现一个基于QT的MobusRTU从站工具。1、概述  ModbusRTU从站应用很常见,有一些是通用的,有一些是专用的。而这里......
  • 学习笔记—— % 你 退 货
    最近对人类智慧比较感兴趣,于是学了一下这之中臭名昭著比较有名的%你退货模拟退火.看不懂的定义模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个......
  • docker笔记
    假设容器id为3a9ac4d50f7d开机时启动dockersudosystemctlstartdocker查看docker情况systemctlstatusdocker重启daemonsystemctldaemon-reload容器配置存放路径/var/lib/docker/containers/https://blog.csdn.net/sosous/article/details/122758984dockerstart容......
  • 如何选购一台适合写代码的笔记本电脑
    如何选购一台适合写代码的笔记本电脑 1.参考指标选择一台写代码的笔记本,其实是很好选择的。不像是选择游戏本,各个指标的性能必须拉满,因为写代码不吃显卡,这块预算可以直接砍掉,用集成显卡就完全可以,把这部分的钱换成别的配置,那么写代码的体验就可以起飞了。下面我讲......