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

简介: 容斥原理常见的问题如下。(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月前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
19天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
42 3
|
24天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
22天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
22天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
45 4
|
29天前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
1月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
78 3
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
42 0
|
24天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用