首页 > 其他分享 >容斥原理

容斥原理

时间:2023-07-15 21:23:45浏览次数:24  
标签:dots cup int cap 容斥 原理 整除 数有

容斥原理

  • 内容
    用于解决多个有相交情况的集合的并集,例如三个集合的情形:输入图片说明

对于n个集合的交集有公式:\(|S_1\cup S_2\cup S_3\cup \dots S_n|=(|S_1|+|S_2|+|S_3|+\dots+|S_n|)-(|S_1\cap S_2|+|S_1\cap S_3|+\dots+|S_{n-1}\cap S_{n}|+(|S_1\cap S_2 \cap S_3|+|S_1\cap S_2\cap S_4|+\dots+|S_{n-2}\cap S_{n-1} \cap S_{n}|\dots+{(-1)}^{n-1}(|S_1\cap S_2 \cap S_3\dots \cap S_n)|)\)
即:奇数个集合相交前面的系数为正,偶数个集合相交系数为负。

  • 数学证明
    若证:\(|S_1\cup S_2\cup S_3\cup \dots S_n|=(|S_1|+|S_2|+|S_3|+\dots+|S_n|)-(|S_1\cap S_2|+|S_1\cap S_3|+\dots+|S_{n-1}\cap S_{n}|+(|S_1\cap S_2 \cap S_3|+|S_1\cap S_2\cap S_4|+\dots+|S_{n-2}\cap S_{n-1} \cap S_{n}|\dots+{(-1)}^{n-1}(|S_1\cap S_2 \cap S_3\dots \cap S_n)|)\)
    只需证:对于任意一个其中的元素x,其属于n个集合中的k个,都有:\(C_k^1-C_k^2+\dots+(-1)^{k-1}C_k^k=1\)即可,我们发现对于\((1-1)^{k}\)二项式展开有:\((-1+1)^{k}=1-C_k^1+C_k^2-C_k^3+\dots+(-1)^kC_k^k\Longleftrightarrow0=1-C_k^1+C_k^2-C_k^3+\dots+(-1)^kC_k^k\Longleftrightarrow C_k^1-C_k^2+\dots+(-1)^{k-1}C_k^k=1\),证毕。
  • 代码实现
    给定一个n和m个不同的质数\(P_1,P_2,P_3\dots P_m\),求出1-n中至少能被一个P整除的数有多少个。
#include<iostream>
using namespace std;
typedef long long LL;
const int M=20;
int p[M];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int x;
        scanf("%d",&x);
        p[i]=x;
    }
    int res=0;
    for(int i=1;i<1<<m;i++)//将所有质数选择情况用1-(2^m-1)的二进制数这2^m-1种情况表示,其中1代表选了这个质数,0表示没选
    {
        int t=1,cnt=0;
        for(int j=0;j<m;j++)
        {
            if(i>>j&1)
            {
                if((LL)t*p[j]>n)
              {
                t=-1;
                break;
              }
              t*=p[j];
              cnt++;
            }
        }
        if(t!=-1)
        {
            if(cnt%2)
            {
                res+=n/t;
            }
            else
            {
                res-=n/t;
            }
        }
        
    }
    printf("%d\n",res);
    
    return 0;
}
  • 代码思路及细节
    由数学知识显然有:1-n中能被\(P_i\)整除的数有\(\lfloor \frac{n}{P_i} \rfloor\)个,且1-n中能被\(P_i和P_k\)同时整除的数有\(\lfloor \frac{n}{P_i*P_k} \rfloor\)个,以此类推:1-n中能被\(P_1P_2\dots P_m\)整除的数有\(\lfloor \frac{n}{P_1P_2\dots P_m} \rfloor\)个。
    对于质数选择的表示我们用了一个小技巧,就是用\(1到2^{m-1}\)这\(2^{m-1}\)个数的二进制来表示,1表示选了这个质数,0代表没有选,例如101就表示选了第一个和第三个质数来求它们在1~n至少能被其中一个数整除的数有多少个。

标签:dots,cup,int,cap,容斥,原理,整除,数有
From: https://www.cnblogs.com/Taco-gu/p/17556964.html

相关文章

  • 信息安全 -- 数据加密 -- HTTPS原理
    对称加密:同一个密钥进行加解密,典型的对称加密方式AES算法优点:运算速度快缺点:密钥需要信息交换的双方共享,一旦被窃取,消息会被破解 非对称加密:公钥加密,私钥解密;或者私钥加密,公钥解密优点:私钥严格保密,公钥任意分发,黑客获取公钥无法破解密文缺点:运算速度非常慢非对称加密的......
  • 助教工作总结(计算机组成原理)
    一、助教工作的具体职责和任务助教,顾名思义就是协助老师完成教学任务。这次的助教任务实际上是来自黄老师的邀请,我非常感谢福明老师的信任与对我的认可。这次助教任务的前期,黄老师问我有没有推荐担任助教的同学,我向黄老师推荐了几个我们级优秀的同学担任助教。后期我就和老师申请......
  • 67.requireJS的核心原理是什么(如何动态加载的如何避免多次加载的如何缓存的)
    67.requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何缓存的?)require.js的核心原理是通过动态创建script脚本来异步引入模块,然后对每个脚本的load事件进行监听,如果每个脚本都加载完成了,再调用回调函数。详细资料可以参考:《requireJS的用法和原理分析》......
  • 109.vue双向数据绑定原理
    109.vue双向数据绑定原理?vue通过使用双向数据绑定,来实现了View和Model的同步更新。vue的双向数据绑定主要是通过使用数据劫持和发布订阅者模式来实现的。首先我们通过Object.defineProperty()方法来对Model数据各个属性添加访问器属性,以此来实现数据的劫持,因此当M......
  • [笔记]组成原理_总线
    总线的概述及特征总线是一组能为多个部件分时共享的公共信息传送线路,分时和共享是总线的两个特点。分时:同一时刻,只允许有一个部件向总线发送信息。共享:总线上可以挂接多个部件,各个部件之间互相交换的信息都可通过这组线路分时共享,多个部件可同时从总线上接收相同的信息。总线......
  • 从零玩转系列之SpringBoot3-核心原理
    一、简介1.前置知识●Java17●Spring、SpringMVC、MyBatis●Maven、IDEA2.环境要求环境&工具版本(orlater)SpringBoot3.1.xIDEA2023.xJava17+Maven3.5+Tomcat10.0+Servlet5.0+GraalVMCommunity22.3+NativeBuildTools0.9.19+......
  • 智能门锁的无线通讯协议有哪些?它的主要特点和工作原理是什么?
    智能门锁的无线通讯协议主要有蓝牙、ZigBee和Wi-Fi等。主要特点如下:蓝牙:是一种支持短距离无线通信的协议,具有低功耗、低成本的特点,适用于移动设备之间的数据传输和连接。Wi-Fi:是一种基于无线局域网的无线通信协议,可以快速传输数据,并支持互联网连接。ZigBee:是一种低功耗、低成本的无......
  • Netty 原理解析与开发实战(一)
    Netty原理解析与开发实战一、Netty概述1.1Java网络编程进化史1.1.1JavaOIO早期java提供了java.net包用于开发网络应用,这类API被称为阻塞JavaOIO(阻塞IO)。服务端主要实例代码:ServerSocketserverSocket=newServerSocket(port);SocketclientSocket=serverSocket.......
  • springmvc自动配置原理
    Springboot这个工具中集成了很多框架,每个框架都有一个xxxAutoConfiguration。在自动配置jar包中的Spring.facroties中有很多xxxAutoConfiguration对应的就是,每个xxxAutoConfiguration都对应了一个框架的自动配置。以springmvc框架为例,springmvc框架他对应了一个WebMvcAutoConfi......
  • kubernetes 实现 list-watch 的底层原理
    我们都知道,controller-manager,scheduler,kubelet会向apiserver监听感兴趣的对象,当监听对象的内容或状态发生变化后,对应的事件会立即推送到监听者。借由这套事件通知机制,kubernetes才能良好地运转。那么这套事件通知机制是如何实现并驱动的呢?1.etcd在k8s中,apiserver是......