组合数学+ybt题解

news/2025/3/1 0:18:40/文章来源:https://www.cnblogs.com/zcxnb/p/18616240

加法原理

乘法原理

排列数

\(n\) 个数中任取 \(m\) 个元素的排列的方案数,表示为 \(A^m_n=\frac{n!}{(n-m)!}\)

\(0!=1\)

全排列 \(A^n_n\)

组合数

\(n\) 个元素中取出 \(m\) 个元素的组合的个数,表示为 \(\dbinom{n}{m}= \frac{A^m_n}{m!}=\frac{n!}{m!(n-m)!}\)

如何理解呢?就是把取出来的排列方案数取缔为一个组合,对于取出来的排列的方案数有 \(m!\) 个,所以用全排列除以 \(m!\) 即可

特别的,规定 \(m>n\) 时,\(A^m_n=\dbinom{n}{m}=0\)

二项式定理

\((a+b)^n=\sum^n_{i=0}\dbinom{n}{i} a^{n-i}b^i\)

通过这个式子,我们可以求出展开式的系数,另外的,杨辉三角也遵循这个规律

证明

二项式定理表明,对于任何正整数\(n\)和任何实数\(a\)\(b\),都有以下等式成立:

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

其中,\(\binom{n}{k}\)是组合数,表示从\(n\)个不同元素中取出\(k\)个元素的组合数。
下面使用数学归纳法来证明二项式定理:
基础步骤(n=0):
\(n=0\)时,等式左边为\((a + b)^0 = 1\),等式右边为\(\binom{0}{0} a^{0-0} b^0 = 1\),显然两边相等,基础情况成立。
归纳假设:
假设当\(n=m\)时,二项式定理成立,即

\[(a + b)^m = \sum_{k=0}^{m} \binom{m}{k} a^{m-k} b^k \]

归纳步骤:
我们需要证明当\(n=m+1\)时,二项式定理也成立。
考虑\((a + b)^{m+1}\),可以将其写成\((a + b)(a + b)^m\),根据归纳假设,我们有:

\[(a + b)^{m+1} = (a + b) \sum_{k=0}^{m} \binom{m}{k} a^{m-k} b^k \]

展开右边的乘积,我们得到:

\[= a \sum_{k=0}^{m} \binom{m}{k} a^{m-k} b^k + b \sum_{k=0}^{m} \binom{m}{k} a^{m-k} b^k \]

将两个求和式合并,我们可以重新排列和组合项:

\[= \sum_{k=0}^{m} \binom{m}{k} a^{m+1-k} b^k + \sum_{k=0}^{m} \binom{m}{k} a^{m-k} b^{k+1} \]

注意到第二个求和式中的项可以重新索引,将\(k+1\)替换为\(k\),得到:

\[= \sum_{k=0}^{m} \binom{m}{k} a^{m+1-k} b^k + \sum_{k=1}^{m+1} \binom{m}{k-1} a^{m+1-k} b^k \]

将两个求和式合并,并注意到当\(k=0\)时,第二个求和式中没有对应项,当\(k=m+1\)时,第一个求和式中没有对应项,因此我们可以将两个求和式合并为一个从\(k=0\)\(k=m+1\)的求和式:

\[= \sum_{k=0}^{m+1} \left( \binom{m}{k} + \binom{m}{k-1} \right) a^{m+1-k} b^k \]

利用组合数的性质\(\binom{m}{k} + \binom{m}{k-1} = \binom{m+1}{k}\),我们有:

\[= \sum_{k=0}^{m+1} \binom{m+1}{k} a^{m+1-k} b^k \]

这正是我们要证明的\(n=m+1\)时的二项式定理的形式。因此,归纳步骤成立。
由基础步骤和归纳步骤,我们可以得出结论,二项式定理对所有正整数\(n\)都成立。

组合数的递推



为什么这个公式成立呢? 考虑一种dp思想,如果我选第n个数,那么我有 \(C^{m-1}_{n-1}\) 种方案,若我不选n,那我有 \(C^m_{n-1}\) 种方案

贴图真好用(逃

组合数的性质


考虑一个n位的二进制数,能组成的数有 \(2^n\) 种,于是 \(C^r_n\) 就是n位中有r个1的数的个数

卢卡斯定理及证明

ps:一般 \(p\in [1e5,1e6]\) ,适合用卢卡斯求组合数

T1:

递推出阶乘,再用快速幂算乘法逆元和次方即可

T2:

卢卡斯定理板子题

我们现预处理出模数以内的阶乘,然后用卢卡斯定理递归到模数以内后求解

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4,p=10007;
int t,n,m;
int fac[N],lg[60];
int quickpow(int x,int k){lg[0]=x;for(int i=1;i<=30;i++){lg[i]=lg[i-1]*lg[i-1]%p;}int res=1;for(int i=0;i<=30;i++){if(!((k>>i)&1))  continue;res=res*lg[i]%p;}return res;
}
int C(int n,int m){if(n<m)  return 0;if(m==0)  return 1;return fac[n]*quickpow(fac[m],p-2)%p*quickpow(fac[n-m],p-2)%p;
}
int lucas(int n,int m){if(n<m)  return 0;if(m==0)  return 1;return C(n%p,m%p)*lucas(n/p,m/p)%p;
}
signed main(){fac[0]=1;for(int i=1;i<=p;i++){fac[i]=fac[i-1]*i%p;}scanf("%lld",&t);while(t--){scanf("%lld%lld",&n,&m);printf("%lld\n",lucas(n,m));}return 0;
}

T3:

数论大杂烩!

还是很好理解的题解

代码:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4,mod=999911659;
int n,g;
int sum[5],lg[60],fac[5][N];
int p[6]={0,2,3,4679,35617,999911659};
int quickpow(int x,int k,int md){lg[0]=x;for(int i=1;i<=40;i++){lg[i]=lg[i-1]*lg[i-1]%p[md];}int res=1;for(int i=0;i<=40;i++){if(!((k>>i)&1ll))  continue;res=res*lg[i]%p[md];}return res;
}
int fan(int x,int y,int md){return quickpow(x,y-2,md);
}  
int C(int n,int m,int md){if(n<m)  return 0;if(m==0)  return 1;return fac[md][n]*fan(fac[md][m],p[md],md)%p[md]*fan(fac[md][n-m],p[md],md)%p[md];
}
int lucas(int n,int m,int md){if(n<m)  return 0;if(m==0)  return 1;return C(n%p[md],m%p[md],md)*lucas(n/p[md],m/p[md],md)%p[md];
}
signed main(){for(int j=1;j<=4;j++){fac[j][0]=1;for(int i=1;i<=p[j];i++){fac[j][i]=fac[j][i-1]*i%p[j];}}scanf("%lld%lld",&n,&g);if(g%mod==0){printf("0\n");return 0;}for(int i=1;i*i<=n;i++){if(n%i!=0)  continue;for(int j=1;j<=4;j++){sum[j]+=lucas(n,i,j);}if(i*i==n)  continue;for(int j=1;j<=4;j++){sum[j]+=lucas(n,n/i,j);}}int ans=0;for(int i=1;i<=4;i++){int k=(mod-1)/p[i];int c=quickpow(k,p[i]-2,i);ans+=sum[i]*k*c;ans%=mod-1;}printf("%lld",quickpow(g,ans,5));
}

T4:

实际意义:有n个带编号的球,划分成标号连续的k段

然后考虑隔板法,答案就是 \(C^{k-1}_{n-1}\)

T5:

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

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

相关文章

苍穹外卖day02

JWT令牌、ThreadLocal、分页查询bug记录知识点记录新增员工新增员工需要填写创建人id和修改人id两个属性,这两个属性应该填本账户的id。 通过拦截器可以解析出JWT令牌中包含的登录员工id信息,但是该如何传递给Service的save方法? ThreadLocal并非一个Thread,而是Thread的局…

年底裁员开始了,大家做好准备吧!

各大互联网公司的接连裁员,政策限制的行业接连消失,让今年的求职雪上加霜,想躺平却没有资本,还有人说软件测试岗位饱和了,对此很多求职者深信不疑,因为投出去的简历回复的越来越少了。 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍,其实是变…

2024-2025-1 20241401 《计算机基础与程序设计》 第十三周学习总结

班级链接 2024计算机基础与程序设计作业要求 第十三周作业教材学习内容总结 《C语言程序设计》第12章结构体的定义和使用: 结构体类型的定义,以及结构体变量的创建和使用。结构体允许将不同数据类型的成员组合成一个整体,以便于管理和引用。 结构体变量的初始化: 结构体变量…

golang的互斥锁和读写锁

golang mutex(互斥锁) 1.锁最本质的作用 保证原子性 2.mutex 使用原则 适用于并发编程,尽量减少加锁区域的逻辑 3.mutex的局限性 仅限于单个进程内操作 sema(信号量,semaphore的简称)是一种用于并发控制的机制 资源计数:信号量维护一个资源计数。这个计数表示当前可用的资源数…

「测试人员」年终总结及来年规划

年底一般企业都会针对项目写总结,一般流程是组员呈交给组长,组长递交给测试经理,所以每个层级写各自的总结,会有不同的侧重点。 今天分别来聊聊测试工程师、测试组长以及测试经理年终总结的关注点在什么地方以及采用什么样的方法及策略使年终总结有实际意义且高大上。📝 …

【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章基于FPGA的2FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR_fpga 2fsk-CSDN博客的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(…

征程 6 云端 Ota 升级方案设计与实现

01 引言 在开发、调测过程中,经常通过 Ota 技术升级应用软件、底软。目前,项目上已将 Matrix6 的 Demo 部署在实车上,每次软件、底软需要版本更替或版本升级时,都需要研发测试同学上到车上使用工控机进行手动升级。 这流程存在耗费人力多,花费时间长,流程易出错的问题,并…

vxe-table 树表格新增数据,插入指定节点位置操作

vxe-table 新增数据,插入指定节点位置操作 官网:https://vxetable.cn npm install vxe-pc-ui@4.3.37 vxe-table@4.9.31// ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css import VxeUITable from vxe-table import vxe-table/lib/style.css // ...createAp…

less5

1.在URL处输入 ?id=1 ?id=1 ?id=1" ?id=1/1发现回显只有you are in......和报错 报错:判断回显是布尔类型 使用order by发现回显有三栏 ?id=1 order by 4%23 ?id=1 order by 1%23 ?id=1 order by 3%23判断数据库长度:8位 ?id=1 and length((select database()))&g…

Java-递归查询部门下所有子部门(包括本部门)

Java-递归查询部门下所有子部门(包括本部门),会得到一个部门id的集合:List deptIds具体代码如下: //递归1public List<Long> queryAllSubInstitutionIds(Long institutionId) {List<Long> subInstitutionIds = new ArrayList<>();querySubInstitutionIds…

生物医学信息

生物信息学基础 生物医学信息学的概念的掌握生物信息学很大一部分工作体现在生物数据的收集、存储、管理与提供 利用多组学数据(基因组,转录组,表观遗传组、蛋白组等)和机器学习、数据挖掘的方法 ,挖掘潜在的生物学、医学的知识和模式,用于解决诊断和治疗。中心法则是什么…