热门标签 | 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;
}

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


推荐阅读
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
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社区 版权所有