基本计数原理

加法原理

解决一件事情,有k类方法,第i类方法有a[i]种选择。那么总方案数=a[1]+a[2]+....+a[k]

乘法原理

解决一件事情,有k个步骤,第i个步骤有a[i]种选择。那么总方案数=a[1] * a[2]....* a[k]

排列组合

排列:
将n个元素选取k个出来构成一个排列,总方案数Ank= n!(nk)!

组合:
将n个元素选取k个出来构成一个集合总方案数Cnk= Ankk!= n!(nk)!k!

多重集的排列与组合数

多重集的排列是指有k种元素,第i种元素的个数为a[i],总元素个数为n,其全排列的方案数为:

n!a1!a2!...ak!

多重集的组合数1:
设有k种元素,第i种元素的个数为a[i],取共计r个元素构成集合且r<=a[i],其组合数:

Ck1r+k1

证明:
考虑隔板法,因为每种元素都可以不选,考虑先给每种元素都选一个,那么也就是选r+k个,隔板法r+k-1个空隙,放k-1个隔板,那么每份隔出的数量-1对应选择该种元素的个数。因为r<=a[i],所以无论隔出的情况如何都不存在出现一种元素选取个数大于其总个数的情况

组合数的常用性质

性质1:

C0n+C1n+....+Cnn=2n

性质2:

Cmn=Cnmn

性质3:

Cmn=Cm1n1+Cmn1

从动态规划的想法出发很好理解:
Cm1n1其实就是第n个数选了,而Cmn1则是没选
写代码的话初始状态设dp[0][0]=1

从另一种角度看,它就是杨辉三角
image

这里不得不提一个很重要的东西:二项式定理

二项式定理

(a+b)n=j=0nCni×ai×bni

所以杨辉三角的元素其实就是二项式定理展开后的系数
这里写一个最简单的证法:
可以把(a+b)n看作(a+b)(a+b)...(a+b),你会发现每一项都只能选a或b,aibni的系数就是n个里面选i个a和n-i个b,也就是Cni

组合数的计算方法

方法1:
利用杨辉三角进行计算,时间复杂度O(n * m)

方法2:
利用定义式计算,要将除以阶乘的部分用乘法逆元处理,时间复杂度O(n)

Ckn=n!inv(k!)inv((nk)!)

ps:该方法要求k!和(n-k)!均与模数p互质

乘法逆元

定义:对于正整数a,p,若a与p互质,那么ax1(modp)时,称a和x在模p意义下互为乘法逆元,记为inv[a]=x
由此可得atmodp=a×inv[t]
而求乘法逆元可以用费马小定理

费马小定理

对于正整数a,p,p为质数,且a与p互质,那么ap11(modp)
于是一凑:aap21(modp),得出a和ap2在模p意义下互为乘法逆元

posted @   星河倒注  阅读(58)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示