算法-容斥原理

 

 venn图:

如何求三个圆圈的面积之和?

\left |A\bigcup_{}^{} B\bigcup C \right | = \left | A \right | + \left | B \right |+\left | C\right | - \left | A\bigcap B \right |- \left | A\bigcap C \right | - \left | B\bigcap C\right |+\left | A\bigcap B\bigcap C \right |

此时,||不代表绝对值,代表集合的个数 

解题思路:

实际上,我们不需要知道每个集合中的元素具体是什么,只需要知道每个集合的大小

例如 |S1|=10\, /\, 2=5,表示10以内能够被2整除的数有5个,每个集合的大小可以根据n\, /\, p来确定。

那么pi\bigcap pj的集合大小怎么算呢,其实就是n\, /\, (pi\, * \, pj)

最后就是如何用代码表示每个集合状态(选或者没有选)?

在这里使用二进制,以 m = 4为例,需要四个二进制位来表示4个集合选中与不选的状态

1101这里表示选中集合S1,S2,S4,故这个集合中元素的个数为 n\, /\, (p1\**p2\**p4)

观察公式不难得出选中集合的个数决定了是正或负,奇数为正,偶数为负

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 20;
int n,m;
int p[N];
int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> n >> m;for(int i = 0; i < m; i++) cin >> p[i];int res = 0;//把i看成m位的二进制// 举所有可能的子集for(int i = 1; i < 1 << m; i++){int t = 1;//乘积作为分母,求该集合元素的个数int s = 0; //选中集合的个数for(int j = 0; j < m; j++){//第j个集合为1,表示选中if(i >> j & 1){if((ll) t * p[j] > n){t = -1;break;}s++;t *= p[j];}}if(t == -1) continue;// 跳过if(s & 1) res += n / t;else res -= n / t;}cout << res <<'\n';return 0;
}

1. 外层循环的作用

外层循环 for(int i = 1; i < 1 << m; i++) 的目的是枚举所有可能的子集。在代码中,m 表示输入的 p 数组中的元素个数,也就是子集的元素个数。

1 << m2^m,代表有 m 个元素的集合所能产生的所有子集的数量。例如,如果 m = 3,那么 1 << m 的值就是 2^3 = 8,也就是 {000, 001, 010, 011, 100, 101, 110, 111},这8种情况分别代表不同的子集。

2.外层循环的过程

一个长度为 m 的数组 p,我们要枚举所有 p 的子集。可以把 m 个元素的数组 p 的每一个子集看作一个长度为 m 的二进制数。这个二进制数中的每一位(0 或 1)表示对应位置的元素是否在子集中:

  • 如果第 j 位是 1,表示 p[j] 这个元素在子集中。
  • 如果第 j 位是 0,表示 p[j] 这个元素不在子集中。

举个例子

假设 p = [2, 3, 5],也就是 m = 3

对于每一个子集,我们可以用一个 3 位的二进制数来表示:

  • i = 0 (000): 空集 {}
  • i = 1 (001): 子集 {5}
  • i = 2 (010): 子集 {3}
  • i = 3 (011): 子集 {3, 5}
  • i = 4 (100): 子集 {2}
  • i = 5 (101): 子集 {2, 5}
  • i = 6 (110): 子集 {2, 3}
  • i = 7 (111): 子集 {2, 3, 5}

在二进制中,第 i 位为 1 表示选中了数组 p 中的第 i 个元素。

3.演示代码过程

输入和初始化

输入的 n = 10m = 2,集合 p = {2, 3}。程序初始化 res = 0

枚举子集

代码中的外层循环 for(int i = 1; i < 1 << m; i++) 会枚举所有的非空子集:

  • i = 1 对应二进制 01,表示子集 {2}
  • i = 2 对应二进制 10,表示子集 {3}
  • i = 3 对应二进制 11,表示子集 {2, 3}
子集计算过程
  1. 子集 {2} (i = 1, 二进制 01)
    • s = 1(因为选中了1个元素)
    • t = 2(当前子集的乘积为2)
    • 计算 10 / 2 = 5110 中能被 2 整除的数有 5 个)。
    • 因为 s 是奇数,所以 res += 5,当前 res = 5
  2. 子集 {3} (i = 2, 二进制 10)
    • s = 1(因为选中了1个元素)
    • t = 3(当前子集的乘积为3)
    • 计算 10 / 3 = 3110 中能被 3 整除的数有 3 个)。
    • 因为 s 是奇数,所以 res += 3,当前 res = 8
  3. 子集 {2, 3} (i = 3, 二进制 11)
    • s = 2(因为选中了2个元素)
    • t = 623 的乘积为6)
    • 计算 10 / 6 = 1110 中能被 6 整除的数有 1 个)。
    • 因为 s 是偶数,所以 res -= 1,当前 res = 7
最终结果

最终,程序输出 res = 7。这意味着在 110 之间,有 7 个数能被 23 整除。

这些数分别是:2, 3, 4, 6, 8, 9, 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411025.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang小项目(1)

Golang小项目(1) 前言 本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。 建议前往 torna.top 查阅效果更佳 项目结构 . ├── main.go └── static├── form.html└── index.html项目流程图 定义三个路由: /:首页,显示static…

Windows隐藏起你的秘密文件以及文件夹工具

我们都知道&#xff0c;在 Windows 中可以右键文件夹&#xff0c;选择”属性“&#xff0c;勾选”隐藏“来实现隐藏某个文件夹。 我们还知道&#xff0c;在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“&#xff0c;来使上述方法变得形同虚设。 本工具就是用于解决以上…

计算机网络模型

应用层 应用层的作用是为应用程序或用户请求提供各种请求服务。 该层协议定义了应用进程之间的交互规则&#xff0c;通过不同的应用层协议为不同的网络应用提供服务。例如域名系统DNS、支持万维网应用的HTTP协议&#xff0c;电子邮件系统采用的SMTP协议等。 表示层 表示层&…

记录|Form1中嵌套Form2时的频闪问题解决[不同于常见的三部曲]

目录 前言一、常见的解决方案二、自己创建渐变色组件GradientPanel三、最终效果展示更新时间 前言 参考文章&#xff1a; C#画图解决闪烁问题 [解决winform中重绘时控件闪烁的问题](panel1.GetType().GetProperty(“DoubleBuffered”,System.Reflection.BindingFlags.Instance …

东芝玉兔2.0明日震撼开售,洗衣机界的全新革命

明天&#xff0c;备受瞩目的东芝玉兔2.0 Pro洗烘套餐将正式开售。这款产品不仅在外观上采用了超薄全嵌的设计&#xff0c;梨川白的配色更是让人眼前一亮。更重要的是&#xff0c;它在功能上进行了全面升级&#xff0c;为用户提供了更全能的服务。 UFB超威跑2.0银离子除菌升级版…

JAVA中的线程池说明一

目录 1.为什么需要线程池? 2.什么是线程池? 3.标准库中的线程池 4.实现自定义线程池 1.为什么需要线程池? 线程的存在意义在于解决并发编程中进程开销过大的问题&#xff0c;因此引入了线程&#xff0c;也被称为"轻量级线程"。相比于创建进程&#xff0c;创建…

【学术会议征稿】第五届机械工程、智能制造与自动化技术国际学术会议(MEMAT 2024)

第五届机械工程、智能制造与自动化技术国际学术会议&#xff08;MEMAT 2024&#xff09; The 5th International Conference on Mechanical Engineering, Intelligent Manufacturing and Automation Technology 目前&#xff0c;我国自动化技术随着科学技术水平的不断提高已经…

功率器件和滤波器件的选型及测试方法

目录 一、功率器件的选型及测试方法 1.1功率器件的选型 1.2功率器件的测试方法 二、滤波器件的选型及测试方法 2.1滤波器件的选型 2.2滤波器件的测试方法 三、表格总结 一、功率器件的选型及测试方法 1.1功率器件的选型 在电子电路设计中&#xff0c;功率器件的选择是…

Mysql索引不当引发死锁问题

1. 前言 在并发量很低的情况下&#xff0c;mysql的响应时延一切正常&#xff0c;一旦并发量上去了&#xff0c;mysql就会出现死锁的情况&#xff0c;你有没有遇到过&#xff1f;到底是是什么原因导致的呢&#xff0c;让我们一起看看真实的案例。 2.遇到的问题 先介绍一下我们…

二进制、十进制转换进阶--小数点后的转换

上一篇文章详细介绍了整数的二进制,八进制,十进制,十六进制之间的转换 详情可前往:二进制、八进制、十进制、十六进制的相互转换-CSDN博客 这篇介绍含有小数点之间的转换 一:二进制转十进制 二进制 101.11 可以分为两部分 101 和 0.11 整数部分 101 转换的方式是从右到左,…

【文心智能体】通过低代码工作流编排创建应用《挑战奥运问答拿奖牌》

欢迎来到《小5讲堂》 这是《文心智能体平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景整体界面大模型链提示词模型 工具链HTTP请求工具 逻辑…

游戏开发设计模式之策略模式

目录 策略模式在游戏开发中的具体应用案例有哪些&#xff1f; 如何在Unity中实现策略模式以优化角色行为和AI策略&#xff1f; 策略模式与其他设计模式&#xff08;如观察者模式、状态模式&#xff09;在游戏开发中的比较优势是什么&#xff1f; 策略模式的优势 观察者模式…

【Qt笔记】QCommandLinkButton控件详解

目录 引言 一、概述 二、特性与属性 1. 属性 2. 样式 三、基本用法 1. 引入必要的头文件 2. 创建和配置 QCommandLinkButton 3. 布局管理 四、高级用法 1. 自定义绘制 2. 动态内容更新 五、代码解析示例 注意 总结 引言 QCommandLinkButton 是 Qt 框架中 QtWi…

android关于binder的简单通信过程

文章目录 简述aidl文件服务端的实现客户端的实现验证过程 简述 主要实现的是两个应用之间跨进程通信的过程&#xff0c;client端调用server端的具体实现&#xff0c;然后server端给client回调数据&#xff0c;详细如下所示 aidl文件 以下的文件需要在服务端与客户端都配置一…

外包干了两年,快要废了。。。

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的…

Linux top 命令详解

top命令是Linux和Unix系统中一个非常强大的实时系统监控工具&#xff0c;它可以显示系统中各个进程的实时动态管理视图&#xff0c;类似于Windows的任务管理器。在需要诊断系统性能问题或监控资源使用情况时是非常有用的。 使用top命令 在命令行中输入top并回车&#xff0c;即…

Dubbo ZooKeeper Spring Boot整合

依赖配置 1. Dubbo 起步依赖 Dubbo 是一款高性能的 Java RPC 框架&#xff0c;用于快速开发高性能的服务。 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.ver…

非阻塞轮询

目录 前言1.options 参数2. 非阻塞轮询3. 模拟非阻塞轮询4. 非阻塞轮询 执行其它任务 前言 继上一篇文章 详谈进程等待 讲到 waitpid 系统调用&#xff0c;在该系统调用接口中还有一个 options 参数&#xff0c;本篇文章介绍 watipid 系统调用中的options 参数 以及 什么是非…

谈到这个痛点,写C的和不写C的码农都沉默了

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2246.html 作为一名在计算机软件行业工作的C工程师&#xff0c;我深知在高要求的内存管理环境中工作有多么艰难。内存分配与优化、避免内存泄漏&#xff0c;都是日常挑战…

工业相机测长仪的组成部分

关键字:工业相机测长仪,高精度测长仪,视觉测量系统,蓝鹏测控测长仪,工业测长仪, 本文介绍了蓝鹏测控公司机器视觉业务 测长仪的核心产品及技术特点&#xff0c;主要涵盖相机部分、相机防护系统、补光系统和软件部分。 &#xff08;一&#xff09;相机部分 我司的机器视觉业务…