容斥原理(CF 547C Mike and Foam CF 449D Jzzhu and Numbers)

news/2025/3/20 17:22:45/文章来源:https://www.cnblogs.com/terrave/p/18783498

容斥原理:

容斥原理(Inclusion-Exclusion Principle)是组合数学中的一个重要原理,用于计算多个集合的并集的大小。它通过考虑集合的交集来避免重复计数。
(可点击此处进行学习)

CF 547C Mike and Foam

题意:

有 q 次操作,每次输入一个 i ,如果 a[i] 没有被拿出来就将它拿出来,如果已经拿出来了就放回去,然后输出每次操作后,拿出来的数里有多少个对 (a[i], a[j]) 互质

思路:

我们可以将每个数的质因子分解出来,因为\(a[i]<=10^5\),并且,最小的\(7\)个质数相乘大于\(10^5\),所以每个数分解后最多\(6\)个因子,可以直接存下来
用一个数组\(cnt\)\(cnt[i]\)表示拿出来的数中有多少个\(i\)的倍数,每次对一个数进行操作时,枚举\(x\)的因子的组合,通过容斥原理就可以求出与\(x\)不互质的数的个数,再用\(cnt[1]\)减去就是与\(x\)互质的个数。所以就可以得到我们的公式:
\(\Delta \textrm{ans} = \textrm{cnt[1]}+(-1)^1\sum{cnt[p_i]}+(-1)^2\sum{cnt[p_i*p_j]}+\dots\)

具体实现过程见代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
const int MAXN = 500010;
typedef long long ll;
// 2 3 5 7 11 13 17
int a[N];
bool v[N];
ll ans;
vector<int> cnt(MAXN, 0), p[MAXN];
int n, q;void add(int x, int k){int sz = p[x].size();for(int i = 0;i < (1 << sz);i ++){int temp = 1;for(int j = 0;j < sz;j ++)if((i >> j) & 1) temp *= p[x][j];cnt[temp] += k;}
}
void query(int x, int k){ll res = 0;int sz = p[x].size();for(int i = 0;i < (1 << sz);i ++){int f = -1, temp = 1;for(int j = 0;j < sz;j ++){if((i >> j) & 1){temp *= p[x][j];f *= -1;}}res += f * cnt[temp];}ans -= res * k;
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);for(int i = 2;i < MAXN;i ++)if(p[i].empty())for(int j = i;j < MAXN;j += i) p[j].push_back(i);cin >> n >> q;for(int i = 1;i <= n;i ++) cin >> a[i];while(q --){int op;cin >> op;if(!v[op]){v[op] = true;query(a[op], 1);add(a[op], 1);}else{v[op] = false;add(a[op], -1);query(a[op], -1);}cout << ans << '\n';}return 0;
}

CF 449D Jzzhu and Numbers

题意:

从数列中取几个数,要求将它们“&”后得到0,问有多少种取法

思路(来处:Azazel):

(蒟蒻不太会写,原文更加详细)
类似上面的枚举因子,这个题我们枚举一个数在二进制下为 0 的位数,再用上一个叫高维前缀和的
我们不好直接找出符合答案要求的,但是可以找出不符合要求的

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1000000007;const int N = 2000010;
ll p[N];
ll ans = 0;
ll g[N];
ll qpow(ll a, ll b){ll res = 1;while(b){if(b & 1) res = (res * a) % mod;b >>= 1;a = a * a % mod;}return res;
}
ll cnt_1(ll x){ll res = 0;while(x){if(x & 1) res++;x >>= 1;}return res;
}
ll mul(ll a,ll b){return a*b % mod;}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;for(int i = 1;i <= n;i ++){int x;cin >> x;p[x] ++;}for(int j = 0;j < 20;j ++)for(int i = (1 << 20) - 1;~i;i --)if(!((i >> j) & 1)) p[i] += p[i | (1 << j)];for(int i = 0;i < (1 << 20);i ++) g[i] = (qpow(2, p[i]) - 1) % mod;for(int i = 0;i < (1 << 20);i ++){// --- 这一步取余的操作非常容易忽视 --ans = ((ans + mul(g[i], cnt_1(i) & 1 ? -1 : 1)) % mod + mod) % mod;}cout << ans;
}

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

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

相关文章

缓存监控治理在游戏业务的实践和探索

通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。作者:来自 vivo 互联网服务器团队- Wang Zhi 通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。 一、缓存监控的背景游戏业务中存在大量的高频请求尤其是对热门游戏而言,而…

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析 ZYNQ系列芯片集成了ARM处理器和FPGA(可编程逻辑单元),正是因为由于ARM处理器的存在,所以我们可以在ZYNQ系列芯片上面运行Linux系统。 在ZYNQ系列芯片上运行Linux会给我们带来很多优势:首先,我们可以将部分逻辑处理…

# 20241902 2024-2025-2 《网络攻防实践》第六周作业

1.实验内容 通过本周的学习和实践,学习使用metasploitable对windows进行远程的渗透测试实验;学习利用wireshark进行日志文件的分析和攻击取证,解读攻击者所利用的攻击、攻击者的具体操作以及如何对攻击行为进行防范;实践同一内网中对利用metasploitable对其他windows系统进…

gitlab+jenkins+harbor+k8s安装操作流程之rancher

关闭防火墙 systemctl stop firewalld yum安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 下载docker-ce.repo源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 安装docker yum install…

win11优化pyenv-venv虚拟环境切换

问题 使用 pyenv-venv activate env_name 命令激活虚拟环境后无法使用tab自动完善命令无法上下键切换历史命令脚本 #!/usr/bin/bashvenvs="/d/JavaProgramFiles/pyenv-win/pyenv-win-venv/envs" # #!/bin/bashactivate () {# 设置 PATHORIGIN_PATH="${ORIGIN_P…

安装Harbor

环境:OS:Centos 7说明:需要docker和 docker compose[root@node1 data]# docker version Client: Docker Engine - CommunityVersion: 26.1.4API version: 1.45Go version: go1.21.11Git commit: 5650f9bBuilt: Wed Jun 5 11:32:04…

Linux学习路线

Linux 学习路线Linux 学习路线 by 程序员鱼皮💂 + 💻 = 👴🏽 建议先观看视频入门:https://www.bilibili.com/video/BV1ev411G7VE/ 为什么学 Linux? 相比于 Windows,Linux 免费、开源、安全、灵活、稳定、便于开发,所以更受企业青睐,甚至 90% 以上 的企业应用都是用…

【无问AI网络安全大模型】协助渗透测试挖掘sql注入

在日常工作中发现了一个登录框,话不多说,搞搞看看存不存在SQL注入。输入用户名密码开始抓包,可以看出用户名密码都进行了加密这个时候输入单引号,发现页面报错。 输入双引号,页面恢复正常这个时候,可以判断这个系统存在注入的可能非常大, 手工使用了报错注入、盲注都不行…

20242934 2024-2025-2 《网络攻防实践》第四周作业

1.实践内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 ARP缓存欺骗攻击:通过伪造ARP消息,欺骗目标设备将攻击者的MAC地址与合法IP地址关联,从而截获或篡改网络数据,造…

ConcurrentHashMap和锁

为什么HashMap数组的长度是2的指数次幂? 因为HashMap的底层是数组+链表+红黑树,在插入元素时,需要通过索引获得插入元素的位置,计算索引的方法是使用哈希函数,将元素的哈希值与数组长度取模,当数组长度是2的指数次幂时,取模操作相当于对元素的哈希值进行二进制位与运算(…

麒麟系统V10系统安全加固

一、安装clamav杀毒软件 1.在clamav官网下载:https://www.clamav.net/downloads 也可以在github上下载早一点的版本:https://github.com/Cisco-Talos/clamav/releases 我这里安装clamav-1.1.2rpm -ivh clamav-1.1.2.linux.x86_64.rpm2.下载病毒库: https://database.clamav.…

孤独摇滚 K-ON wallpapers

双厨狂喜 孤独摇滚K-ON