题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1439

【题目描述】
有n个数字,a[1],a[2],…,a[n]。有一个集合,刚开始集合为空。然后有一种操作每次向集合中加入一个数字或者删除一个数字。每次操作给出一个下标x(1 ≤ x ≤ n),如果a[x]已经在集合中,那么就删除a[x],否则就加入a[x]。

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

注意,集合中可以有重复的数字,两个数字不同当且仅当他们的下标不同。

比如a[1]=a[2]=1。那么经过两次操作1,2之后,集合之后存在两个1,里面有一对互质。

Input
单组测试数据。
第一行包含两个整数n 和 q (1 ≤ n, q ≤ 2 × 10^5)。表示数字的种类和查询数目。
第二行有n个以空格分开的整数a[1],a[2],…,a[n] (1 ≤ a[i] ≤ 5 × 10^5),分别表示n个数字。
接下来q行,每行一个整数x(1 ≤ x ≤ n),表示每次操作的下标。

Output
对于每一个查询,输出当前集合中互质的数字有多少对。
Input示例
样例输入1
5 6
1 2 3 4 6
1
2
3
4
5
1
样例输入2
2 3
1 1
1
2
1
Output示例
样例输出1
0
1
3
5
6
2
样例输出2
0
1
0
【思路】
如果已经知道现在集合中有多少对互质对,现在新加入一个元素x,那么只要计算这个xx和集合中的所有元素能够形成多少个互质对,加到答案中去,删除元素同理. 问题就是要计算一个数字和一堆数字会组成多少互质对,反过来考虑问题,也可以计算组成非互质对的个数然后用集合的大小减去就得到互质对的个数
那非互质对怎么计算,假设新加入一个整数xx,原来集合中有一个元素uu,如果(x,u)(x,u)不是互质对,那么gcd(x,u)!=1gcd(x,u)!=1 同时 gcd(x,u)gcd(x,u)的值一定是xx的一个因子,这里我们就可以遍历xx的每一个大于1的因子,然后用容斥原理来计算了,具体怎么算这里举个例子,比如现在集合SS中已经有了5个元素,新加入一个x=24x=24,我们遍历xx的所有大于1的因子2,3,4,6,8,12,242,3,4,6,8,12,24,如果集合SS中有约数为2的数,那么xx就会和SS中每一个有约数2的数产生一个非互质对,同理其它的约数3,4,6,8...3,4,6,8...都是,但是会算重,如果已经计算过SS中有约数为2的个数和约数为3的个数,那么其实已经计算过了SS中有约数为6的个数了,而且还算了两回,所以这里就要减掉了.而对于4,8,12,244,8,12,24而言,它们都已经在计算2,32,3的时候算过了,可以发现这里新产生的互质对的对数为5−S中有约数2的个数−S中有约数3的个数+S中有约数6的个数5−S中有约数2的个数−S中有约数3的个数+S中有约数6的个数 对于每个约数而言,前面的系数就是莫比乌斯函数的函数值
代码中先把每个数的约数都预处理出来,然后在主函数中直接枚举,要用输入挂才能卡过去

#include<bits/stdc++.h>
namespace fastIO {#define BUF_SIZE 100000//fread -> read1,bool IOerror = 0;inline char nc() {static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;if(p1 == pend) {p1 = buf;pend = buf + fread(buf, 1, BUF_SIZE, stdin);if(pend == p1) {IOerror = 1;return -1;}}return *p1++;}inline bool blank(char ch) {return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';}inline void read(int &x) {char ch;while(blank(ch = nc()));if(IOerror)return;for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');}#undef BUF_SIZE
};using namespace std;
using namespace fastIO;
typedef long long ll;const int maxa=200005;
const int maxn=500005;bool vis[maxn];
int prim[maxn];
int mu[maxn];
int cnt;void get_mu(int n){mu[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){prim[++cnt]=i;mu[i]=-1;}for(int j=1;j<=cnt && prim[j]*i<=n;j++){vis[prim[j]*i]=1;if(i%prim[j]==0) break;else mu[i*prim[j]]=-mu[i];}}
}int n,q;
int a[maxa];
bool in[maxa];
int c[maxn];
vector<int> g[maxn];void init(){get_mu(maxn-1);for(int i=1;i<maxn;++i){for(int j=i;j<maxn;j+=i){g[j].push_back(i);}}
}int main(){init();read(n);read(q);for(int i=1;i<=n;++i) read(a[i]);ll ans=0;while(q--){int id,x;read(id);x=a[id];if(!in[id]){int num=g[x].size();for(int i=0;i<num;++i){int u=g[x][i];ans+=mu[u]*c[u];++c[u];}}else{int num=g[x].size();for(int i=0;i<num;++i){int u=g[x][i];--c[u];ans-=mu[u]*c[u];}}in[id]=!in[id];printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465182.html

51Nod 1439 - 互质对(容斥+莫比乌斯函数)相关推荐

  1. bzoj2440 [中山市选2011]完全平方数 容斥+莫比乌斯函数

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这 ...

  2. P4318 完全平方数 [二分答案+容斥+莫比乌斯函数]

    完 全 平 方 数 完全平方数 完全平方数 D e s c r i p t i o n \mathcal{Description} Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨 ...

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

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

  4. 2022杭电多校九 1008-Shortest Path in GCD Graph(质因子+容斥)

    题目链接:杭电多校九 - Virtual Judge 题目: 样例输入: 6 2 4 5 3 6 样例输出: 1 1 2 2 题意:给定n个点的完全图,两个点之间的距离为他们的gcd,q次询问,每次询 ...

  5. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

  6. hdu5468 Puzzled Elena(容斥 莫比乌斯反演)

    hdu5468 Puzzled Elena 题意 求一棵子树内与它互质的点个数 解法 容斥 我们先求出与它不互质的数的个数,再用总数减去就好. #include <cstdio> #inc ...

  7. CodeForces 1139D Steps to One(概率dp 容斥/莫比乌斯反演)

    题目链接https://codeforces.com/contest/1139/problem/D 题意:给定一个m,每次在1-m中随机取一个数放到容器中,当容器的gcd为1时停止,求期望步数,用分数 ...

  8. UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理

    这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...

  9. `Computer-Algorithm` 数论基础知识 (同余,取模,快速幂,质数,互质,约数,质因子)

    catalog 同余 取模 快速幂 质数 互质 约数 质因子 @Delimiter(旧解释) 经验谈 两数之差也整除 加一的特殊性 取模 累加的周期性 取模的唯一集合 取模下的四则运算 除法的不可约性 ...

最新文章

  1. 干货丨手把手带你玩转机器学习和深度学习
  2. WebStorm无法显示文件夹目录
  3. Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
  4. Jenkins创建Maven项目及SSH部署
  5. python3精要(10)-while,for
  6. freemarker写select组件报错总结(二)
  7. asp手机拍照显示_会员动态飞凯材料120吨TFTLCD混合液晶显示项目,建后五年达产...
  8. 报告 | 73%的“落伍”开发者说:明年要学AI技术
  9. 冯诺依曼计算机主机,冯诺依曼计算机的基本思想是什么?
  10. [礼仪大赛策划方案]图:如何打造一场精美极致的礼仪大赛?PPT动态柱状图,如何动态显示?Flash如何渲染PPT界面呢?
  11. Linux中的jobs、fg与bg命令
  12. 华为内部硬件开发设计流程
  13. 如何使用visio画出思维导图
  14. webrtc.node: undefined symbol: _ZN3rtc10DIGEST_MD5E
  15. 【他山之石】康师傅的本地化策略
  16. linux循环显示系统时间,Linux shell时间处理大全,值得收藏
  17. Vulkan简介(1)
  18. C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)
  19. SWAN之ikev2/acert-fallback测试
  20. 可爱的python测试开发库(python测试开发工具库汇总)

热门文章

  1. 和功率的计算公式_电机功率计算公式是什么?
  2. turtle库绘制圆_Python绘画:应用Turtle库绘制“抖音艺术字”
  3. 【Mybatis】sqlSessionTemplate.getConnection() 遇到 java.sql.SQLException: Connection is closed
  4. 【thymeleaf】Access to request parameters is forbidden in this context
  5. android o测试版,一加手机可升级!谷歌已正式推送Android O测试版系统
  6. xml.etree ElementTree简介
  7. java thrift client_使用thrift的java client调用python server
  8. des加密算法python代码_python des加密算法代码(pydes模块加密)
  9. 3d slicer如何下载出radiomics_Lumion 10.0 软件下载及安装教程
  10. python编程语言一览_编程语言学习:python有趣用法汇总