热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第三十六章数论——容斥原理原创

原标题:第三

原标题:第三十六章 数论——容斥原理
原创


第三十六章 数论——容斥原理



  • 一、容斥原理

    • 1、定理内容

  • 二、代码模板


    • 1、问题


      • (1)如何求出能够被整除的个数?

      • (2)如何枚举出





        2


        n






        1



        2^n-1


        2n1
        种情况?


    • 2、代码实现:





一、容斥原理


1、定理内容

我们在高中阶段都学过韦恩图,韦恩图其实就是用来描述集合与集合之间的关系的。

我们看下面的图:
请添加图片描述
这道题的话,我们首先将三个圆圈加在一起,但是叶子形状的部分会被我们重复加了两遍,所以我们要减去。但是三个叶子形状的中间也会有交叉的部分。所以这个部分又被我们减少了三次。所以我们还要再加上一次中间部分。

因此,就出现了我们图中的红色式子。

因此,我们总结出了一个规律。如果我们求的是奇数个集合的合并,那么我们就要加上。如果是偶数个集合的合并,我们就要减去。

那么我们从这个特殊的例子推广到一般情况,就会得到如下公式:
请添加图片描述
而这个式子就是我们的容斥原理

那么容斥原理的时间复杂度是多少呢?

我们可以看作我们的前面有




n



n


n
个集合




S



S


S
,那么我们从中选出1个集合就是





C


n


1




C_n^1


Cn1

选出任意两个集合的交集,就是





C


n


2




C_n^2


Cn2

那么依次类推:

我们选出所有集合所需的情况就是:







C


n


1



+



C


n


2



+



C


n


3



+


.


.
文章来源地址10912.html

.


+



C


n


n




C_n^1+C_n^2+C_n^3+...+C_n^n


Cn1+Cn2+Cn3+...+Cnn

而根据我们高中的知识:






C


n


0



+



C


n


1



+



C


n


2



+



C


n


3



+


.


.


.


+



C


n


n



=



2


n




C_n^0+C_n^1+C_n^2+C_n^3+...+C_n^n=2^n


Cn0+Cn1+Cn2+Cn3+...+Cnn=2n

那么我们选出所有情况来运用容斥原理计算的次数就是:







C


n


1



+



C


n


2



+



C
文章来源站点https://www.yii666.com/

n


3



+


.


.


.


+

www.yii666.com

C


n


n



=



2


n






1



C_n^1+C_n^2+C_n^3+...+C_n^n=2^n-1


Cn1+Cn2+Cn3+...+Cnn=2n1

时间复杂度就是




O


(



2


n



)



O(2^n)


O(2n)


二、代码模板


1、问题

在这里插入图片描述

这道题可以转化成下面的图片:

请添加图片描述
紫色圈代表能够被p1整除的,绿色圈代表能被p2整除的,依此类推。题目中就是让我求上图中的元素个数。

如果我们只是单纯的把被某个数整除的数字个数加起来的话,中间一定会有重复的。因此,我们需要根据容斥原理来求。

利用容斥原理的话,我们有以下几个问题:


(1)如何求出能够被整除的个数?

其实很简单,能被





p


1




p_1


p1
整除的个数是




[



N



p


1




]



[\frac{N}{p_1}]


[p1N]

中间的交集的话,我们以能够被





p


1




p_1


p1
或者





p


2




p_2


p2
为例。我们只需要求




[



N




p


1







p


2





]



[\frac{N}{p_1*p_2}]


[p1p2N]

依次类推。


(2)如何枚举出





2


n






1



2^n-1


2n1
种情况?

那么这个枚举的话,可以采用二进制的思想,我们的情况一共是





2


n






1



2^n-1


2n1
种,我们将其转化为二进制的话,(以n=3)为例:







2


3



文章来源地址10912.html www.yii666.com


1


=


111



2^3-1=111


231=111

每一位代表一个集合,此时三位都是1,说明我们要求三个集合的交集

那么如果是




101



101


101
,就代表我们要求第一个集合和第三个集合的交集。

而我们的所有情况无非就是从




001





111



001-111


001111
,换算为十进制的话,我们就是要枚举从




1



1


1






2


n






1



2^n-1


2n1
。这中间的每个数字的二进制位都代表着一种情况。

当上述两个问题解决之后,我们就可以套用容斥原理的公式了。


2、代码实现:

#include
using namespace std;
typedef long long LL;
const int N=20;
int p[N];
int main()
{
int n,m,res=0;
cin>>n>>m;
//读取除数
for(int i=0;i<m;i++)scanf("%d",p+i);
//枚举情况
for(int i=1;i<1<<m;i++)
{
//t用来记录结果,s用来记录集合的个数
int t=1,s=0;
//枚举情况i的二进制位
for(int j=0;j<m;j++)
{
if(i>>j&1)//如果这一位是1,那么就让该位对应的集合参与运算
{
if((LL)t*p[j]>n)//如果几个数的积,已经大于了n,那么这种情况不存在。
{
t=0;//如果不存在了,就直接扔掉就好了。
break;
}
t*=p[j];//乘上该集合所对的除数
s++;//记录参与的集合个数
}
}
if(t)
{
//使用容斥原理:
if(s%2)res+=n/t;//如果集合是奇数就加上
else res-=n/t;//如果集合是偶数就减去
}
}
cout<<res<<endl;
}

来源于:第三十六章 数论——容斥原理
原创


推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
author-avatar
卫凤莉_463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有