算法提高:组合数学| 容斥原理常见应用

简介: 容斥原理常见的问题如下。(1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人?(2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?

640.jpg

容斥原理常见的问题如下。

(1) 篮球、羽毛球、网球三种运动,至少会一种的有22人,会篮球的有15人,会羽毛球的有17人,会网球的有12人,既会篮球又会羽毛球的有11人,既会羽毛球又会网球的有7人,既会篮球又会网球的有9人,那么三种运动都会的有多少人?

(2) 《西游记》《三国演义》《红楼梦》三大名著,至少读过其中一本的有20人,读过《西游记》的有10人,读过《三国演义》的有12人,读过《红楼梦》的有15人,读过《西游记》《三国演义》的有8人,读过《三国演义》《红楼梦》的有9人,读过《西游记》《红楼梦》的有7人。问三本书全都读过的有多少人?

01、原理概述

容斥原理是一种较常用的计数方法,其基本思想是: 先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏,又无重复。

容斥原理核心的计数规则可以记为一句话: 奇加偶减。

假设被计数的有A、B、C三类,那么,A、B、C类元素个数总和=A类元素个数+B类元素个数+C类元素个数-既是A又是B的元素个数-既是B又是C的元素个数-既是A又是C的元素个数+既是A又是B且是C的元素个数,即A∪B∪C=A+B+C-A∩B-B∩C-A∩C+A∩B∩C,如图1所示。

640.png


■ 图1容斥定理

当被计数的种类被推到n类时,其统计规则遵循奇加偶减。

容斥定理最常用于求[a,b]区间与n互质的数的个数,该问题可视为求[1,b]区间与n互质的个数减去[1,a-1]区间内与n互质的个数,故可先对n进行因子分解,然后从[1,b]、[1,a-1]区间中减去存在n的因子的个数,再根据容斥定理,奇加偶减,对n的因子的最小公倍数的个数进行处理即可。

02、常见应用

  1. 求[a,b]中与n互素的个数

问题可转换为区间[1,b]中与n互素的数的个数减去区间[1,a-1]中与n互素的数的个数,那么问题就转换为对于n,求1~k中与n互质的数有多少个,因此可以先反着求1~k中与n不互质的数有多少个。

故对n进行因子分解,然后从1~k中减去不能与n整除的数的个数,然后根据容斥定理奇加偶减,最后答案是: 1~b的元素个数减去1~a-1的元素个数再减去1~b中与n不互质的数的个数加上1~a-1中与n互质的数的个数,即b-(a-1)-calculate(b)+calculate(a-1)

bool bprime[N];LI prime[N],cnt,factor[N],num;void isprime() l
//筛选素数
cnt=0;
memset(bprime,false,sizeof(bprime)) ;for(LL i=2; i<N; i+) {
   
   if(!bprime[i]) [prime[cnt++]=i;for(LL j=i*i; j<N; j+=i)bprime[il=true;
void getFactor(int n){
   
   
num= 0;
for(LL i=0;prime[i] *prime[i]<=n&&i<cnt; i++) {
   
   if(n%prime[il==0) [factor[num++]=prime[il;while(n%prime[il== 0)n/=prime[il;
//记录 n 的因子
if(n!=1)
//1 既不是素数,也不是合数
factor[num++]=n;
LI calculate(LL m,LL num) (
LL res=0;
for(LL i=l; i<(1<<num); i++) {
   
   
LL sum= 0;
LI temp=1;
for(LL j=0;j<num; j++) {
   
   
if(i&(1<<j)) {
   
   
sum+ + ;
temp *=factor[j];
if(sum%2)
res+=m/temp;
else
res-=m/temp;
return res;
int main() {
   
   
isprime();
LL a,b,n;
scanf("%1ld%lld号lld",&a,&b,&n);getFactor(n)//容斥定理,奇加偶减LL res= (b-(a-1)-calculate(b,num))+calculate(a-1,num);printf("lld\n",res);return 0;
  1. 求[1,n]中能/不能被m个数整除的个数

对于任意一个数a[i]来说,我们知道在1-n中有n/a[i]个数是a[i]的倍数,但这样将m个数扫一遍一定会用重复的数,因此需要用到容斥原理。

根据容斥定理的奇加偶减,对于m个数来说,其中的任意2,4,…,2k个数就要减去它们最小公倍数能组成的数,1,3,…,2k+1个数就要加上它们的最小公倍数,因此m个数就有2m种情况,对于每种状态,依次判断由多少种数组成,然后再进行奇加偶减即可。

根据容斥原理有: sum=从m中选1个数得到的倍数的个数-从m中选2个数得到的倍数的个数+从m中选3个数得到的倍数的个数-从m中选4个数得到的倍数的个数……

那么,能被整除的个数就是sum,不能被整除的个数就是n-sum。

LL GCD(IL a,LL b) {
   
   
return !b? a:GCD(b,ab) ;
LL LCM(LL a,LL b)[
return a/GCD(a,b) *b;
IL a[N];
int main(){
   
   
II n;
int m;
scanf("1ldd",&n, &m) ;for(int i=0;i<m;i++)scanf("%lld",&alil);
LL sum= 0;for(int i=0;i<(1<<m) ;i++){
   
   LL lcm= 1;LL cnt=0;for(int j=0;j<m;j++){
   
   if(i&(1<<j)){
   
   lcm=LCM(lcm,aljl) ;cnt++;
//2”种状态
//从 m 中选出个数
if(cnt!=0){
   
   
if(cnt&1)
//奇加
sum+=n/lcm;
else
//偶减
sum-=n/1cm;
printf(%lld "lld\n",sum,n-sum);return 0;
目录
相关文章
|
1月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
85 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
27天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
128 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
1月前
|
算法 Java 数据库
理解CAS算法原理
CAS(Compare and Swap,比较并交换)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相同来决定是否进行更新。JDK 5引入了基于CAS的乐观锁机制,替代了传统的synchronized独占锁,提升了并发性能。然而,CAS存在ABA问题、循环时间长开销大和只能保证单个共享变量原子性等缺点。为解决这些问题,可以使用版本号机制、合并多个变量或引入pause指令优化CPU执行效率。CAS广泛应用于JDK的原子类中,如AtomicInteger.incrementAndGet(),利用底层Unsafe库实现高效的无锁自增操作。
理解CAS算法原理
|
1月前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
79 3
|
1月前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
66 0
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
69 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
85 1
|
2月前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
2月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
107 3