数学计数

排列组合的定义

排列

\(n\) 个不同元素中,任取 \(m\) 个不同的元素按照一定的顺序排成一列,所有可能的情况种数叫做排列数,记作 \(A_n^m\)

\[A_n^m=\frac{n!}{(n-m)!} \]

组合

\(n\) 个不同元素中,任取 \(m\) 个元素并成一组,所有可能的情况种数叫做组合数,记作 \(C_n^m\),也记作 \(\binom{n}{m}\)
对于二者的区别最直观的理解就前者考虑顺序,而后者不考虑。

加法原理

做一件事,完成它可以有 \(n\) 类方法,在第一类方法中有 \(m_1\) 种不同方法,在第二类方法中有 \(m_2\) 种不同方法,……,在第 \(n\) 类方法中有 \(m_n\) 种不同方法,那么完成这件事共有 \(\sum_{i=1}^n m_i\) 种不同的方法。

乘法原理

做一件事,完成它需要分成 \(n\) 个步骤,做第一步有 \(m_1\) 种不同的方法,做第二步有 \(m_2\) 种不同的方法,……,做第 \(n\) 步有 \(m_n\) 种不同的方法。那么完成这件事共有 \(\prod_{i=1}^n m_i\) 种不同的方法。

二项式定理

\[(a+b)^n=\sum_{i=0}^n\binom{n}{i}a^ib^{n-i} \]

变形:

\[(a-b)^n=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}a^ib^{n-i} \]

\[\frac{(a+b)^n+(a-b)^n}{2}=\sum_{i为偶数}^n\binom{n}{i}a^{n-i}b^i \]

性质:

  • 杨辉三角与二项式系数有对应关系,所以根据杨辉三角的性质,我们可以得到递推关系:\(\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}\)
  • \(n\) 个里面选 \(k\) 个,就相当于不选 \(n-k\) 个,这与选 \(n-k\) 个相等,\(\binom{n}{k}=\binom{n}{n-k}\)
  • \(a=b=1\)\(2^n=\sum_{i=0}^n\binom{n}{i}\)
  • \(\sum_{i为奇数}\binom{n}{i}=\sum_{i为偶数}\binom{n}{i}=2^{n-1}\)

快速计算组合数的方法

  • 预处理逆元,定义法计算
void init(){fact[0]=1;for(int i=1;i<=n;i++)fact[i]=fact[i-1]*i%mod;inv_fact[n]=qpow(fact[n],mod-2,mod);//费马小定理,当然也可以用其他方式for(int i=n-1;i>=0;i--)inv_fact[i]=inv_fact[i+1]*(i+1)%mod;return;
}
long long comb(int n,int k){return fact[n]*inv_fact[k]%mod*inv_fact[n-k]%mod;
}
  • 将杨辉三角打表
  • 模数较小的时候使用 Lucas 定理和 exLucas 定理
    Lucas 定理 \(\binom{n}{k}=\binom{n\bmod p}{k\bmod p}\times \binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{k}{p}\rfloor}\),可以持续展开。注意,\(p\) 必须是质数
int comb(int n,int k,int p){if(k>n) return 0;if(k==n||k==n) return 1;//C(n,0)=C(n,n)=1int res=1;for(int i=1;i<=k;i++)res=res*(n-k+i)/i;return res%p;
}
int lucas(int n,int m,int p){if(m==0) return 1;return lucas(n/p,m/p,p)*comb(n%p,m%p,p)%p;
}

范德蒙德卷积

\[\sum_{i=0}^k\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k} \]

组合意义:在一个大小为 \(n+m\) 的集合中取出 \(k\) 个数,可以等于把大小为 \(n+m\) 的集合拆成两个集合,大小分别为 \(n\)\(m\),然后从 \(n\) 中取出 \(i\) 个数,从 \(m\) 中取出 \(k-i\) 个数的方案数。由于我们有了对于 \(i\) 的枚举,于是只需要考虑一种拆法,因为不同的拆法之间是等价的。
变式:

  • \(\sum_{i=1}^n\binom{n}{i}\binom{n}{n-1}=\binom{2n}{n-1}\)
  • \(\sum_{i=0}^n{\binom{n}{i}}^2=\binom{2n}{n}\)
  • \(\sum_{i=0}^m\binom{n}{i}\binom{m}{i}=\binom{n+m}{m}\)

隔板法

模型一:将 \(n\) 个相同苹果放入 \(m\) 个不同的箱子里的方案数(可以限制是否为空)。
考虑箱子里至少放 \(1\) 个苹果的情况,将这 \(n\) 个苹果排成一列,形成 \(n-1\) 个空隙,在这 \(n-1\) 个空隙中插入 \(m-1\) 个板子,就形成了一种解。所以解为 \(\binom{n-1}{m-1}\)
箱子可以为空时解为 \(\binom{n-1+m}{m-1}\),假设每个箱子里多出了一个虚拟苹果,我们就又回到了刚才的问题。
模型二:求方程 \(x_1+x_2+\cdots+x_m=n\) 的正整数解或自然数解的方案数。
变式:上式中 \(=\) 变为 \(\le\)\(<\),我们可以虚拟一个 \(x_0\) 令其加上后面的 \(x\) 等于 \(n\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893652.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250305

1 烧碱的C浪回调后 开始布局中线多单。

玄机靶场通关(持续更新)

穷,没钱开靶场,全是看网上WP尝试自学。 你这应急响应,还真是高高在上呢……玄机靶场通关 全部要VIP,所以穷鬼我要看别人的WP来学 Windows应急-应急与研判训练计划一 服务器场景操作系统 Windows 服务器账号密码 administrator P@ssw0rd 题目来源公众号 ©州弟学安全 任…

代码在线运行工具网站神器——OneCompiler,程序员必备!

今天给大家分享一款功能强大的代码在线运行工具网站——OneCompiler,它可以让你轻松实现代码的编写、运行和分享。 网址 OneCompiler目前已经被收录在【3M万能在线工具箱】的【编程开发】工具中,这里也提供大家直接的网址: OneCompiler:https://onecompiler.com/ 支持70多种…

OV5640摄像头驱动学习

简介: OV5640的功能框架如图:增益放大器(AMP)以及ISP等可以通过寄存器(registers)来配置,配置寄存器的接口就是SCCB接口,该接口协议兼容IIC协议。 SCCB (Serial Camera Control Bus)串行摄像头控制总线。该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以…

基于PID控制器的双容控制系统matlab仿真

1.课题概述 基于PID控制器的双容控制系统matlab仿真,仿真输出PID控制下的水位和流量两个指标。2.系统仿真结果 (完整程序运行后无水印) 3.核心程序与模型 版本:MATLAB2022a% 绘制结果图形 t1 = 0:1:times; t2 = 0:1:(times-1); hmax = 23*ones(1,times); % 硬约…

【APP逆向37】hook失败之ptrace占坑

现象使用attach方式hook,frida -UF -l hook.js原因unable to access process with pid 17124 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root这是ptrace占坑的标志。ptrace可以让一个进程监视和控制另一个进程的执行,并且…

AI训练进行web前后端开发协助

周五我们进行了针对web开发辅助的ai训练,以下是训练过程: 首先我搭建好了环境 然后我根据编程习惯将web前后端分成了这几点:之后我就将其丢给了deepseek,它直接帮我生成了上到mysql表格建立,下到前端jsp页面的所有文件, 哎,这之前怎么没觉得ai这么好用啊,要是用上这种开…

JavaWeb学习(六)

JavaWeb学习(六):Web前端开发 —— 其余内容 目录JavaWeb学习(六):Web前端开发 —— 其余内容Ajax前端工程化Vue 组件库 ElementVue 路由打包部署 本文为个人学习记录,内容学习自 黑马程序员Ajax概念:Asynchronous JavaScript And XML,异步的 JavaScript 和 XML作用:…

leetcode hot 19

解题思路:这题思路主要是用某个容器(数组等)来存储链表,然后再用双指针或者同时遍历的方法就可以判断。我使用栈进行存储,出栈的元素相当于链表倒序,如果和链表正序的结果相同就证明是回文。如果想用O(1)的空间,就把前一半或后一半的链表倒转,然后遍历就可以了。 /*** D…

code.c WriteUp

题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5 WriteUp 题目名称:code.c 分类:Reverse 描述:得到源码的输出结果 解题思路 首先用Vscode查看code.c文件,发现该文件对argv[]进行判断处理,其中很容易联想到这和输出结果紧密联系。依次…

6. Calcite添加自定义函数

1. 简介 在上篇博文中介绍了如何使用calcite进行sql验证, 但是真正在实际生产环境中我们可能需要使用到用户自定义函数(UDF): 通过代码实现对应的函数逻辑并注册给calcitesql验证: 将UDF信息注册给calcite, SqlValidator.validator验证阶段即可通过验证 sql执行: calcite通过调…

P10945 Place the Robots 紫 题解

Part 1. 题意 在 \(N \times M\) 的矩阵中的空地放人机,任一人机上下左右走到边界或墙之前遇不到另一人机。 我已经尽力写得简短了。。Part 2. 思路 我们先思考无墙的情况。 若无墙,则同車的放置,把草方块当作禁止放車的方块即可,。 贴一下车的放置的代码: #include <b…