容斥原理(有求区间(1-r)里面跟n互质的个数的高效方面模板)

2024-02-14 15:48

本文主要是介绍容斥原理(有求区间(1-r)里面跟n互质的个数的高效方面模板),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

容斥原理 编辑
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。[1]
中文名 容斥原理 外文名 Principle of inclusion-exclusion[2] 别 称 排容原理 应用学科 组合数学 计算机
目录
1 公式
2 严格证明
3 原理
公式编辑

也可表示为
设S为有限集, ,则

由于

所以

两个集合的容斥关系公式:A∪B =|A∪B| = |A|+|B| - |A∩B |(∩:重合的部分)
三个集合的容斥关系公式:|A∪B∪C| = |A|+|B|+|C| - |A∩B| - |B∩C| - |C∩A| + |A∩B∩C|

详细推理如下:
1、 等式右边改造 = {[(A+B - A∩B)+C - B∩C] - C∩A }+ A∩B∩C
2、维恩图分块标记如右图图:1245构成A,2356构成B,4567构成C
3、等式右边()里指的是下图的1+2+3+4+5+6六部分:
那么A∪B∪C还缺部分7。
4、等式右边[]号里+C(4+5+6+7)后,相当于A∪B∪C多加了4+5+6三部分,
减去B∩C(即5+6两部分)后,还多加了部分4。
5、等式右边{}里减去C∩A (即4+5两部分)后,A∪B∪C又多减了部分5,
则加上A∩B∩C(即5)刚好是A∪B∪C。
严格证明编辑
对于容斥原理我们可以利用数学归纳法证明:
证明:当 时,等式成立(证明略)。
假设 时结论成立,则当 时,

所以当 时,结论仍成立。因此对任意 ,均可使所证等式成立。[1]
原理编辑
如果被计数的事物有A、B两类,那么,A类B类元素个数总和= 属于A类元素个数+ 属于B类元素个数—既是A类又是B类的元素个数。(A∪B = A+B - A∩B)
例1 一次期末考试,某班有15人数学得满分,有12人语文得满分,并且有4人语、数都是满分,那么这个班至少有一门得满分的同学有多少人?
分析
依题意,被计数的事物有语、数得满分两类,“数学得满分”称为“A类元素”,“语文得满分”称为“B类元素”,“语、数都是满分”称为“既是A类又是B类的元素”,“至少有一门得满分的同学”称为“A类和B类元素个数”的总和。
答案
15+12-4=23
试一试
电视台向100人调查前一天收看电视的情况,有62人看过2频道,34人看过8频道,其中11人两个频道都看过。两个频道都没看过的有多少人?
100-(62+34-11)=15
中学教科书给出的定义
如果被计数的事物有A、B、C三类,那么,A类和B类和C类元素个数总和= A类元素个数+ B类元素个数+C类元素个数—既是A类又是B类的元素个数—既是A类又是C类的元素个数—既是B类又是C类的元素个数+既是A类又是B类而且是C类的元素个数。(A∪B∪C = A+B+C - A∩B - B∩C - C∩A + A∩B∩C)[1]
例1(小学奥数题)
某校六⑴班有学生45人,每人在暑假里都参加体育训练队,其中参加足球队的有25人,参加排球队的有22人,参加游泳队的有24人,足球、排球都参加的有12人,足球、游泳都参加的有9人,排球、游泳都参加的有8人,问:三项都参加的有多少人?
分析:参加足球队的人数25人为A类元素,参加排球队人数22人为B类元素,参加游泳队的人数24人为C类元素,既是A类又是B类的为足球排球都参加的12人,既是B类又C类的为足球游泳都参加的9人,既是C类又是A类的为排球游泳都参加的8人,三项都参加的是A类B类C类的总和设为X。注意:这个题说的每人都参加了体育训练队,所以这个班的总人数即为A类B类和C类的总和。
答案:25+22+24-12-9-8+X=45 ,解得X=3[3]
例2(高中题)
在1到1000的自然数中,能被3或5整除的数共有多少个?不能被3或5整除的数共有多少个?
分析:显然,这是一个重复计数问题(当然,如果不怕麻烦你可以分别去数3的倍数,5的倍数)。我们可以把“能被3或5整除的数”分别看成A类元素和B类元素,能“同时被3或5整除的数(15的倍数)”就是被重复计算的数,即“既是A类又是B类的元素”。求的是“A类或B类元素个数”。我们还不能直接计算,必须先求出所需条件。1000÷3=333……1,能被3整除的数有333个(想一想,这是为什么?)同理,可以求出其他的条件。
例3(高中题)
分母是1001的最简分数一共有多少个?
分析:这一题实际上就是找分子中不能与1001进行约分的数。由于1001=7×11×13,所以就是找不能被7,11,13整除的数。
解答:1~1001中,有7的倍数1001/7 = 143 (个);有11的倍数1001/11 = 91 (个),有13的倍数1001/13 = 77 (个);有7*11=77;77是11的倍数1001/77 = 13 (个),有7*13=91;91是13的倍数;1001/91 = 11 (个),有11*13=143;143是13的倍数1001/143 = 7 (个).有1001的倍数1个。
由容斥原理知:在1~1001中,能被7或11或13整除的数有(143+91+77)-(13+11+7)+1=281(个),从而不能被7、11或13整除的数有1001-281=720(个).也就是说,分母为1001的最简分数有720个。
例4(小学奥数题)
某个班的全体学生在进行了短跑、游泳、投掷三个项目的测试后,有4名学生在这三个项目上都没有达到优秀,其余每人至少有一项达到了优秀,达到了优秀的这部分学生情况如下表:
短跑
游泳
投掷
短跑
游泳
短跑
投掷
游泳
投掷
短跑
游泳
投掷
1 7
1 8
1 5
6
6
5
2
求这个班的学生共有多少人?
分析:这个班的学生数,应包括达到优秀和没有达到优秀的。
4+17+18+15-6-6-5+2=39(人)
试一试:一个班有42人,参加合唱队的有30人,参加美术组的有25人,有5人什么都没有参加,求两种都参加的有多少人?
(30+25+5)-42=18(人)[3]
例5(小学奥数题)
在一根长的木棍上有三种刻度线,第一种刻度线将木棍分成10等份,第二种将木棍分成12等份,第三种将木棍分成15等份。如果沿每条刻度线将木棍锯断,木棍总共被锯成多少段?
分析:
很显然,要计算木棍被锯成多少段,只需要计算出木棍上共有多少条不同的刻度线,在此基础上加1就是段数了。
若按将木棍分成10等份的刻度线锯开,木棍有9条刻度线。在此木棍上加上将木棍分成12等份的11条刻度线,显然刻度线有重复的,如5/10和6/12都是1/2。同样再加上将木棍分成15等份的刻度线,也是如此。所以,我们应该按容斥原理的方法来解决此问题。用容斥原理的那一个呢?想一想,被计数的事物有那几类?每一类的元素个数是多少?
解答
解一:[10,12,15]=60,设木棍60厘米
60÷10=6厘米,60÷12=5厘米,60÷15=4(厘米
10等分的为第一种刻度线,共10-1=9(条)
12等分的为第二种刻度线,共12-1=11(条)
15等分的为第三种刻度线,过15-1=14(条)
第一种与第二种刻度线重合的[6,5]=30,60÷30-1=2-1=1(条)
第一种与第三种刻度线重合的[6,4]=12,60÷12-1=5-1=4(条)
第二种与第三种刻度线重合的[5,4]=20,60÷20-1=3-1=2(条)
三种刻度线重合的没有,[6、5、4]=60
因此,共有刻度线9+11+14-1-4-2=27条,木棍总共被锯成27+1=28段。
解二:总长看成单位1分别分成10、12、15段。1/10与1/12的最小公倍数1/2,1/10与1/15的最小公倍数1/5,1/12与1/15的最小公倍数1/3,1/10,1/12和1/15的最小公倍数为1,有10+12+15-(2+5+3)+1=28
解三:
10、12、15的最小公倍数是60,假设木棍就是长60,
1、那么,分成10等份的每份6,刻度就是
0,6,12,18,24,30,36,42,48,54,60
2、分成12等分的每份就是5,
0,5,10,15,20,25,30,35,40,45,50,55,60
3、分成15等分的每份就是4,
0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60
4、把相同刻度的合并,就是有刻度如下:
0,4,5,6,8,10,12,15,16,18,20,24,25,28,30,32,35,36,40,42,44,45,48,50,52,54,55,56,60[3]
例6
给定r,n求[1,r]内与n互素的个数有多少个?
分析:
看到这个问题,数论有学一点的童鞋可能会想如果r = n的话,不就是欧拉函数了吗?是的,可惜这个问题的r ,n是不一定会相等的。直接求解问题就是比较复杂的。所以我们还是研究这个问题是逆问题。也就是说求gcd(k,n) >= 2,在1 - n之间k有多少个 。那么我们就可以枚举n的素因子来进行求解。

//时间复杂度O(sqrt(n))…
(注意加上头文件#include)
int solve(int r, int n)
{
vectorp;
for (int i = 2; i * i <= n; ++i){
if (n % i == 0){
p.push_back(i);
while (n % i == 0) n /= i;
}
}
if (n > 1) p.push_back(n);
int sum = 0;
for (int S = 1; S < (1 << p.size()); ++S){
int mult = 1, bits = 0;
for (int i = 0; i < p.size(); ++i){
if (S & (1 << i)){
++bits;
mult *= p[i];
}
}
int cur = r / mult;
if (bits % 2 == 1) sum += cur;
else sum -= cur;
}
return r - sum;
}

这篇关于容斥原理(有求区间(1-r)里面跟n互质的个数的高效方面模板)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708932

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报