算法随笔 - 容斥原理学习

890. 能被整除的数 - AcWing题库

在补牛客多校7的I题I-We Love Strings_2023牛客暑期多校训练营7 (nowcoder.com)时发现处理重复集合用了容斥原理来做,感觉我对容斥原理不太熟悉,因此上网学了学容斥原理。

n个集合的容斥原理的公式为:
∪ i = 1 m S i = S 1 + S 2 + S 3 + S 4 . . . + S m − ( S 1 ∩ S 2 + S 1 ∩ S 3 + . . . + S m − 1 ∩ S m ) + S 1 ∩ S 2 ∩ S 3 + S 1 ∩ S 2 ∩ S 4 . . . + / − . . . \cup_{i=1}^mS_i = S_1 + S_2 + S_3 + S_4 ...+S_m - (S_1 \cap S_2 + S_1 \cap S_3 + ... + S_m-1 \cap S_m) + S_1 \cap S_2 \cap S_3 + S_1 \cap S_2 \cap S_4 ... +/- ... i=1mSi=S1+S2+S3+S4...+Sm(S1S2+S1S3+...+Sm1Sm)+S1S2S3+S1S2S4...+/...
实际上,就是奇数项是加上这个集合的元素,偶数项是减去这个集合的元素。

时间复杂度是:
C n 1 + C n 2 + C n 3 + . . . + C n n C_n^1 + C_n^2 + C_n^3 + ... + C_n^n Cn1+Cn2+Cn3+...+Cnn
经过二项式化简,为O(2^n - 1),因此是O(2^n),指数级别的时间复杂度。

对于容斥原理的大部分题而言,枚举一定会超时的。但是可以用二进制进行优化。对于容斥原理的大部分题而言,n比较小,可以枚举2^n个,在里面套个枚举长度的。

e.g.

for(int k = 1; k < (1 << n); ++k) { // 枚举所有状态,一共2^nfor(int i = 0; i < n; ++i) { if(k >> i & 1) { // 第i个选的情况...}}// 选了奇数/偶数 再进行操作
}

注意:k >> i & 1中的 &

练习题:890. 能被整除的数 - AcWing题库

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <ctime>
#include <random>
#include <sstream>
#include <numeric>
#include <stdio.h>
#include <functional>
#include <bitset>
#include <algorithm>
using namespace std;// #define Multiple_groups_of_examples
#define IOS std::cout.tie(0);std::cin.tie(0)->sync_with_stdio(false);
#define dbgnb(a) std::cout << #a << " = " << a << '\n';
#define dbgtt cout<<" !!!test!!! "<<endl;
#define rep(i,x,n) for(int i = x; i <= n; i++)#define all(x) (x).begin(),(x).end()
#define pb push_back
#define vf first
#define vs secondtypedef long long LL;
typedef pair<int,int> PII;const int INF = 0x3f3f3f3f;
const int N = 2e5 + 21;void inpfile();
void solve() {int n,m; cin>>n>>m;vector<int> p(m);for(auto &t: p) cin>>t;int ans = 0;for(int k = 1; k < ( 1 << m); ++k) {int cnt = 0; // 选了几个int t = 1;for(int i = 0; i < m; ++i) {if(k >> i & 1) { // 第i个是否可选if(1LL * t * p[i] > n) { // 如果相乘大于n,为0,直接break:因为可能有n^m,LL也超,需要大数运算t = -1;break;}cnt++;t *= p[i];}}if(t == -1) continue;// 容斥原理:奇数相加,偶数相减if(cnt % 2 !=  0) {ans += n / t;} else ans -= n / t;}cout<<ans;
}
int main()
{#ifdef Multiple_groups_of_examplesint T; cin>>T;while(T--)#endifsolve();return 0;
}
void inpfile() {#define mytest#ifdef mytestfreopen("ANSWER.txt", "w",stdout);#endif
}

算法基础(二十八):数学基础 - 容斥原理 - 知乎 (zhihu.com)

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

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

相关文章

Python第一次作业练习

题目分析&#xff1a; """ 参考学校的相关规定。 对于四分制&#xff0c;百分制中的90分及以上可视为绩点中的4分&#xff0c;80 分及以上为3分&#xff0c;70 分以上为2分&#xff0c;60 分以上为1分; 五分制中的5分为四分制中的4分&#xff0c;4分为3分&#…

Centos7更新php7.2版本升级

之前搭建的LNMP环境php使用yum安装的版本为7.2&#xff0c;现有项目wordpress安装wp插件需要php7.4版本的支持&#xff0c;需要在原来的环境更新php版本。 一、卸载php7.2 yum remove php*原先的安装方式是yum安装直接yum remove就可以卸载否则需要rpm命令查询&#xff0c;按…

js-数字格式化千分位

数字格式化千分位1234567890 转 1,234,567,890 1、while循环 <template><div>{{ num | formatNum }}</div> </template><script>export default {data() {return {num: 1234567890}},filters: {formatNum(arg) {let count arg.lengthlet arr …

使用python-dotenv进行高效的环境管理

1 python-dotenv 项目简介 项目地址&#xff1a;https://github.com/theskumar/python-dotenv功能描述&#xff1a;从 .env 文件读取键值对&#xff0c;并将它们添加到环境变量中。核心理念&#xff1a;在项目中&#xff0c;可以将所有使用的环境变量写入 .env 文件&#xff0…

RNA 37. SCI 文章中基于转录组计算肿瘤免疫浸润得分

这期推荐软件包 xCell:数字化描绘组织细胞异质性景观&#xff0c;通过它可以计算bulk 转录组的免疫浸润得分&#xff0c;下面我们就看看怎么来实现吧&#xff01; 简 介 组织是由许多细胞类型组成的复杂环境。在癌症领域&#xff0c;了解肿瘤微环境中的细胞异质性是一个新兴…

【css | loading】好看的loading特效

示例&#xff1a; https://code.juejin.cn/pen/7277764394618978365 html <div class"pl"><div class"pl__dot"></div><div class"pl__dot"></div><div class"pl__dot"></div><div c…

第51节:cesium 范围查询(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

Axure RP 10汉化版下载 Axure RP 10 mac授权码

Axure RP10汉化版是最强大的计划&#xff0c;原型设计和交付给开发人员的方法&#xff0c;而无需编写代码。能够制作逼真的&#xff0c;动态形式的原型。 Axure RP 10汉化版下载 Axure RP 10 mac授权码 RP 10有什么新功能&#xff1f; 1.显示动态面板 使用Axure RP 10&…

docker 镜像内执行命令显示:You requested GPUs: [0] But your machine only has: []

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在docker 镜像环境中&#xff0c;执行“docker exec -it container_name /bin/bash “进入容器之后&#xff0c;执行对应的python命令&#xff0c;显示You requested GPUs: [0] But your machine only…

【深度学习】P1 单层神经网络 - 线性回归(待完成)

单层神经网络 - 线性回归 线性回归基本要素1. 模型2. 模型训练3. 训练数据4. 损失函数5. 优化算法6. 模型预测 线性回归与神经网络1. 神经网络图 以一个简单的房屋价格预测为例&#xff0c;介绍解释线性回归这一单层神经网络。无需纠结于什么是单层神经网络&#xff0c;在本文的…

Hadoop_02

hadoop相比于传统文件系统的优点&#xff1a; 1.无限扩展 2.传统文件元数据分布在不同的机器上难以寻找&#xff0c;通过将元数据统一存放在一个服务器上解决 3.传统文件太大导致上传下载慢&#xff0c;通过分块并行上传到服务器解决 4.副本机制数据不容易丢失&#xff0c;解决…

python代码笔记230910

1.解释错误&#xff1a;TypeError: only integer scalar arrays can be converted to a scalar index 抱歉给出的解释有误。要返回列表中最小值的索引&#xff0c;可以使用index()方法。然而&#xff0c;当你尝试在列表中包含多个相同最小值时&#xff0c;index()方法可能会引…

JavaScript里面的二进制

概述 最近在做IOT设备配网开发的时候&#xff0c;处理了很多跟二进制、字节相关的事情&#xff0c;总结了一下JavaScript中有关二进制方面的一些知识点。 二进制和字节 首先&#xff0c;现代计算机是基于二进制的&#xff0c;从现代计算机电路来说&#xff0c;只有高电平/低电平…

Sql语句大全--查询

今天抽空整理下项目中的Sql语句* 项目中用到的Sql语句大全 Selcet 语句&#xff0c;有简有难 Selcet 语句&#xff0c;有简有难 基本的查询语句 select * from OLASCS.LLDC where CAPOLselect CATAX,CASU from OLASCS.LLDC where CAPOL IN (122345)SELECT EO,EANT, EAUS, sub…

TypeScript 中的 any、unknown、never 和 void

any any 表示 任意类型。 它是任意类型的父类&#xff0c;任意类型的值都可以赋予给 any 类型&#xff1a; // 编译不会报错 let anything: any 前端西瓜哥;let flag: boolean true; anything flag;anything { num: 2 };它可以表示任何类型&#xff0c;并使用它们的语法…

AIGC参数量节节攀升,对存储带来的挑战如何解决?

引言 近期&#xff0c;AIGC 相关产品如同雨后春笋一般不断涌现。但在技术层面&#xff0c;大家普遍的关注点更多集中在性能方面&#xff0c;却经常忽略了存储对推理和训练效率的影响&#xff0c;以及 AIGC 内容可能带来的合规风险。我们特邀腾讯云存储的产品负责人 崔剑老师和…

C++ QT qml 学习之 做个登录界面

最近在学习QT,也初探到qml 做ui 的灵活性与强大,于是手痒痒,做个demo 记录下学习成果 主要内容是如何自己编写一个按钮以及qml多窗口。 参考WX桌面版,做一个登录界面,这里面按钮是写的一个组合控件,有 按下,释放,以及正常 三种状态。 import QtQuick 2.0 import QtQ…

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…

【Linux】—— 在Linux上进行读写文件操作

前言&#xff1a; 在之前&#xff0c;我已经对进程的相关知识进行了详细的介绍。本期开始&#xff0c;我们将要学习的是关于 “基础I/O”的知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;C文件接口 &#xff08;二&#xff09;系统文件I/O 1、接…

WebDAV之π-Disk派盘 + BubbleUPnP

BubbleUPnP是一款功能强大的Android播放器,支持UPnP/DLNA多屏互动。它可以将手机内容投屏到电视大屏上,与家人和朋友一起共享。此外,BubbleUPnP还提供了丰富的音乐和影视资源,您可以在线搜索并播放喜欢的内容。 以下是BubbleUPnP的一些主要特点: 1. 支持Chromecast和转码…