题意

给定一个长度为 nnn 的数组,a[1],a[2],...,a[n]a[1],a[2],...,a[n]a[1],a[2],...,a[n]。维护一个集合,一开始集合为空。一共有 qqq 次操作,每次操作给定一个下标 pospospos,如果 a[pos]a[pos]a[pos] 已经在集合中,则将 a[pos]a[pos]a[pos] 从集合中删除,否则将 a[pos]a[pos]a[pos] 加入集合。注意,集合允许有重复的数字。(1≤n,q≤2∗105,1≤a[i]≤5∗105,1≤pos≤n)(1\leq n,q\leq 2*10^5,1\leq a[i]\leq 5*10^5,1\leq pos\leq n)(1≤n,q≤2∗105,1≤a[i]≤5∗105,1≤pos≤n)

问每次操作完之后,集合中互质的数字有多少对。

题目链接:linklinklink


思路

此题算是一道比较经典的容斥题,也可以用莫比乌斯函数来求解,但二者本质是一样的。

首先比较容易想到的是,往集合中加一个数 a[pos]a[pos]a[pos],则答案加上集合中与 a[pos]a[pos]a[pos] 互质数的个数;从集合中删除一个数 a[pos]a[pos]a[pos],则答案减去集合中与 a[pos]a[pos]a[pos] 互质数的个数,这种做法的复杂度是 O(nq)O(nq)O(nq)。

想要进一步优化复杂度,则需要降低求集合中与 a[pos]a[pos]a[pos] 互质数个数的复杂度。我们将求互质转为求不互质,即:
与a[pos]互质数的个数=集合大小−与a[pos]不互质数的个数与 \ a[pos]\ 互质数的个数 = 集合大小-与 \ a[pos]\ 不互质数的个数 与 a[pos] 互质数的个数=集合大小−与 a[pos] 不互质数的个数
又因为如果 xxx 与 yyy 不互质,则必存在至少一个质数 ccc,满足 x%c==0x \% c==0x%c==0 且 y%c==0y\%c==0y%c==0,因此我们假设 a[pos]a[pos]a[pos] 的质因子有 p1∗p2p_1*p_2p1​∗p2​,C[p1]C[p_1]C[p1​] 表示集合中有多少个数有 p1p_1p1​ 这个质因子,则可以根据容斥原理得到:
与a[pos]不互质的个数=C[p1]+C[p2]−C[p1∗p2]与\ a[pos]\ 不互质的个数 = C[p_1]+C[p_2]-C[p_1*p_2] 与 a[pos] 不互质的个数=C[p1​]+C[p2​]−C[p1​∗p2​]
所有我们可以先求出每个数的质因子集合,然后用 dfsdfsdfs 枚举质因子子集,每当得到一个子集,则将子集中的数字全部乘起来,同时更新 CCC 数字与容斥答案,具体细节见代码。


代码

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i = a; i <= b; i++)
typedef long long ll;
const int N = 5e5+1000;
using namespace std;int n,q,a[N],vis[N],flag[N],C[N];
ll ans, tmp, cot;vector<int> prime[N];void init() {scanf("%d%d",&n,&q);rep(i,1,n) scanf("%d",&a[i]);for(int i = 2; i <= 5e5; i++){if(vis[i]) continue;for(int j = i; j <= 5e5; j += i) {vis[j] = 1;prime[j].push_back(i);}}
}void dfs(int now, int num, int cnt, int mul, int op) {if(num == prime[now].size()) return;if(op == 1) {// 加入 nowtmp += cnt*C[mul*prime[now][num]];C[mul*prime[now][num]]++;}else {// 减去 nowC[mul*prime[now][num]]--;tmp += cnt*C[mul*prime[now][num]];}dfs(now, num + 1, cnt, mul, op);dfs(now, num + 1, cnt*(-1), mul*prime[now][num], op);
}int main()
{init();while(q--) {int pos; scanf("%d",&pos);flag[pos] ^= 1;tmp = 0;if(flag[pos]) {dfs(a[pos], 0, 1, 1, 1);ans += cot - tmp;cot++;}else {dfs(a[pos], 0, 1, 1, -1), cot--;ans -= cot - tmp;}printf("%lld\n", ans);}return 0;
}

【51nod 1439】互斥对【容斥原理】相关推荐

  1. 51Nod 1439 - 互质对(容斥+莫比乌斯函数)

    题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1439 [题目描述] 有n个数字,a[1],a[2],-,a[ ...

  2. [概统]本科二年级 概率论与数理统计 第一讲 古典概型

    [概统]本科二年级 概率论与数理统计 第一讲 古典概型 古典概型 排列组合复习 组合恒等式的例题 古典概型的例题 事件概率的性质 条件概率与独立性 全概率公式与贝叶斯公式 事件概率的例题 打算这两年写 ...

  3. [51nod]1284 2 3 5 7的倍数(容斥原理)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1284 1 #include <iostream> ...

  4. 51nod 1284:2 3 5 7的倍数 容斥原理

    1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5  难度:1级算法题  收藏  关注 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如 ...

  5. 51nod 1585 买邮票送邮票 容斥原理+线性筛

    题意 商店里面有n张邮票,现在去买一张,然后老板会送若干张(至少一张)邮票.如果老板送的邮票的面值的最大公约数不是1,并且老板送的邮票和我们购买的邮票的面值最大公约数是1,那么就是一组好的邮票组合.问 ...

  6. HDU - 1796 How many integers can you find(容斥原理)

    题目链接:点击查看 题目大意:给出一个n,再给出一个含有m个数的集合,问1~n-1中有多少个数可以被集合中的所有数字整除 题目分析:因为1~n-1中的每个数可能会被整除多次,所以我们可以利用容斥原理枚 ...

  7. HDU - 4135 Co-prime(容斥原理)

    题目链接:点击查看 题目大意:给出一个区间[l,r],再给出一个n,问区间中有多少个数与n互质 题目分析:容斥原理应用的经典题目,马克一篇非常不错的博客,留着以后慢慢消化: https://blog. ...

  8. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],-,a[n].有一个集合,刚开 ...

  9. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  10. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

最新文章

  1. Spring学习笔记_IOC
  2. 你想要的生信知识全在这——生信宝典目录 (181202)
  3. CMDB 设计(二)实现host、ip存储
  4. centos7 python
  5. 光纤收发器不同品牌之间的兼容性互通
  6. 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
  7. 心血来潮,小试c++11
  8. 李志民:只修长城不会有真正的安全
  9. JavaScript详细版
  10. 小学计算机小蘑菇教案,幼儿园中班小蘑菇教案.doc
  11. u盘量产linux pe,WinPE U盘量产ISO
  12. 计算机软件实习每日学习打卡(3)20201204
  13. 目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究
  14. KDD 2020(五) | 基于多源异构信息整合的视频标题生成模型(作者带你读论文)...
  15. 【python】flask框架
  16. 达人评测 华为matebook16对比联想小新pro16锐龙版 2021哪个好
  17. 移动GPU渲染原理的流派——IMR、TBR及TBDR
  18. 哈工大2022秋计算机系统大作业——程序人生
  19. linux 虚拟机大量udp请求失败_linux遭受UDP攻击解决办法
  20. 三星升级android9,没买的不必看!三星手机各机升级Android 9.0 时间表

热门文章

  1. 【转载】C++引用详解
  2. Great Song
  3. 修改Gravatar生成的默认头像
  4. SprinMVC 拦截器验证权限和登录与注销的实现
  5. 2018湘南学院计算机分数线,湘南学院录取分数线2021是多少分(附历年录取分数线)...
  6. linux中文件大小的分配,Linux创造固定的文件大小-预分配磁盘空间
  7. java wifi设置 linux,Debian系列Linux的WiFi配置
  8. java 按钮不可用_java – 如何使按钮不可点击
  9. 计算机硬盘坏道解决办法
  10. K进制 nyoj882