题目描述

有$n$个正整数$x_1\sim x_n$,初始时状态均为未选。有$m$个操作,每个操作给定一个编号$i$,将$x_i$的选取状态取反。每次操作后,你需要求出选取的数中有多少个互质的无序数对。


输入格式

第一行两个整数$n,m$。第二行$n$个整数$x_1\sim x_n$。接下来$m$行每行一个整数。


输出格式

$m$行,每行一个整数表示答案。


样例

样例输入:

4 5
1 2 3 4
1
2
3
4
1

样例输出:

0
1
3
5
2


数据范围与提示

对于$20\%$的数据,$n,m\leqslant 1,000$。
对于另外$30\%$的数据,$x_i\leqslant 100$。
对于$100\%$的数据,$n,m\leqslant 200,000$,$x_i\leqslant 500,000$,$1\leqslant i\leqslant n$。


题解

我们先来设三个量:

  $\alpha.s(i)$表示为$i$的倍数的数的个数。

  $\beta.g(i)$表示 $gcd$为$i$的倍数的数个数。

  $\gamma.f(i)$表示$gcd$为$i$的数的个数。

$s(i)$很好就能求出,而$g(i)=\frac{s(i)\times (s(i)-1))}{2}$,但是我们需要的是$f(i)$,该怎么办呢?

显然,$g(i)=\sum \limits_{i|d}f(d)$,那有又什么用呢?

这里就需要用到一个神奇的东东了:第二类莫比乌斯反演(详见信息学奥赛之数学一本通P145中间)。

于是这个式子便变成了:$f(i)=\sum \limits_{i|d}\mu(\frac{d}{i})g(d)$。

现在我们需要考虑的就只有修改操作了,每次插入或删除一个数的时候只要暴力枚举其因数即可。

时间复杂度:$\Theta(m\sqrt{\max x_i})$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. long long a[200001];
  5. long long s[500001],g[500001],f[500001];
  6. long long mu[500001],prime[500001],cnt;
  7. bool vis[200001],v[500001];
  8. long long ans,mx;
  9. void pre_work()
  10. {
  11. mu[1]=1;
  12. for(int i=2;i<=mx;i++)
  13. {
  14. if(!v[i])mu[prime[cnt++]=i]=-1;
  15. for(int j=0;j<cnt&&i*prime[j]<=mx;j++)
  16. {
  17. v[i*prime[j]]=1;
  18. if(i%prime[j])mu[i*prime[j]]=-mu[i];
  19. else{mu[i*prime[j]]=0;break;}
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. scanf("%d%d",&n,&m);
  26. for(int i=1;i<=n;i++)
  27. scanf("%lld",&a[i]),mx=max(mx,a[i]);
  28. pre_work();
  29. while(m--)
  30. {
  31. int x,flag;
  32. scanf("%d",&x);
  33. flag=a[x];
  34. if(vis[x])
  35. {
  36. for(int i=1;i*i<=flag;i++)
  37. if(!(flag%i))
  38. {
  39. s[i]--;
  40. ans-=mu[i]*g[i];
  41. g[i]=s[i]*(s[i]-1)/2;
  42. ans+=mu[i]*g[i];
  43. if(flag/i!=i)
  44. {
  45. s[flag/i]--;
  46. ans-=mu[flag/i]*g[flag/i];
  47. g[flag/i]=s[flag/i]*(s[flag/i]-1)/2;
  48. ans+=mu[flag/i]*g[flag/i];
  49. }
  50. }
  51. vis[x]=0;
  52. }
  53. else
  54. {
  55. for(int i=1;i*i<=flag;i++)
  56. if(!(flag%i))
  57. {
  58. s[i]++;
  59. ans-=mu[i]*g[i];
  60. g[i]=s[i]*(s[i]-1)/2;
  61. ans+=mu[i]*g[i];
  62. if(flag/i!=i)
  63. {
  64. s[flag/i]++;
  65. ans-=mu[flag/i]*g[flag/i];
  66. g[flag/i]=s[flag/i]*(s[flag/i]-1)/2;
  67. ans+=mu[flag/i]*g[flag/i];
  68. }
  69. }
  70. vis[x]=1;
  71. }
  72. printf("%lld\n",ans);
  73. }
  74. return 0;
  75. }

rp++

[CSP-S模拟测试]:gcd(莫比乌斯反演)的更多相关文章

  1. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  2. HDU1695 GCD(莫比乌斯反演)

    传送门 看了1个多小时,终于懂了一点了 题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数 思路:令F(i)表示i|gcd(x,y)的 ...

  3. hdu 1695 GCD 莫比乌斯反演入门

    GCD 题意:输入5个数a,b,c,d,k;(a = c = 1, 0 < b,d,k <= 100000);问有多少对a <= p <= b, c <= q <= ...

  4. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  5. HYSBZ - 2818 Gcd (莫比乌斯反演)

    莫比乌斯反演的入门题,设 \(F(x): gcd(i,j)\%x=0\) 的对数,\(f(x): gcd(i,j)=x\)的对数. 易知\[F(p) = \lfloor \frac{n}{p} \rf ...

  6. 【BZOJ2818】Gcd [莫比乌斯反演]

    Gcd Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 给定整数N,求1<=x,y&l ...

  7. Luogu P2257 YY的GCD 莫比乌斯反演

    第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...

  8. BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2534  Solved: 1129 [Submit][Status][Discu ...

  9. BZOJ 2820 luogu 2257 yy的gcd (莫比乌斯反演)

    题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便 ...

随机推荐

  1. 全文搜索 ElasticSearch

    今天突然想了解一下ES,看看有什么优势,能不能用在项目中. 说到ES就不得不了解它的底层技术-全文检索 Ref: 全文检索的基本原理 https://blog.csdn.net/wangmaohong ...

  2. Web控件LinkButton

    <asp:LinkButton ID="" runat="server" ></asp:LinkButton> 编译后就变成了回发事件 ...

  3. Orcle获取当前时间加小时

    如下是oracle 获取当前数据库时间加2个小时 select to_date(TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24: ...

  4. SAP smartforms打印数据出框线或跟框线重叠,但是预览是正常的

    如图,打印内容压在框线上,但是打印预览是正常的 预览图如下,预览是正常的 预览用PDF!命令,导出PDF,也是正常的,就直接打印有问题,不是打印机的问题,用Adobe PDF打印机也是不行 如果只有一 ...

  5. spring-第十篇之XML Schema的简化配置,p、c、util命名空间

    1.p:命名空间 引入命名空间:xmlns:p="http://www.springframework.org/schema/p" 配置举例: <?xml version=& ...

  6. spring-第六篇之创建bean的3种方式

    1.创建bean的方式有3种: 1>使用构造器创建bean,即设值注入.构造注入本质都是使用bean的构造器创建bean的. 2>使用静态工厂方法创建bean. 3>调用实例工厂方法 ...

  7. Python入门习题7.分别统计输入各类字符个数

    例7.用户从键盘输入一行字符,编写一个程序,统计并输出其中的英文字符(包括中文字符).数字.空格和其他字符个数. #字符数统计.py Str = input('请输入一行字符:') alpha = 0 ...

  8. go 学习之io/ioutil包

    // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情// 并且始终成功返回.var Discard io.Writer = devNull(0) // Re ...

  9. Server Tomcat v8.5 Server at localhost failed to start.

    问题描述:新建了一个项目,建立servlet文件然后改了下@WebServlet("floorButtonServlet")映射的路径,重启debug之后服务器启动失败. 在网上查 ...

  10. centos7 nginx完整支持thinkphp pathinfo模式开启方法

    thinkphp运行在linux+nginx,如何开启pathinfo模式,我是完整测试过了,没问题的,在thinkphp配置文件 开启    'URL_MODEL'   =>  1,   1代 ...