点此看题面

大致题意: 一个长度为\(n\)的数组,实现两种操作:单点修改,给定\(i\)求\(\sum_{j=1}^na_j[gcd(i,j)=1]\)。

莫比乌斯反演

考虑推一推询问操作的式子:

\[\sum_{j=1}^na_j[gcd(i,j)=1]
\]

按照莫比乌斯反演的一般套路,我们知道\(\sum_{p|x}\mu(p)=[x=1]\),因此我们枚举一个\(p\):

\[\sum_{j=1}^na_j\sum_{p|i,p|j}\mu(p)
\]

调整枚举顺序,得到:

\[\sum_{p|i}\mu(p)\sum_{j=1}^na_j[p|j]
\]

考虑到一个数的约数个数很少,所以我们可以直接枚举\(p\),然后只要维护满足\(p|j\)的\(a_j\)之和,就可以求出答案。

则我们可以发现,同样因为一个数的约数个数很少,单点修改时,我们可以枚举所修改位置的编号的约数并修改每个约数的答案,这样就能实现维护了。

代码

  1. #include<bits/stdc++.h>
  2. #define Tp template<typename Ty>
  3. #define Ts template<typename Ty,typename... Ar>
  4. #define Reg register
  5. #define RI Reg int
  6. #define Con const
  7. #define CI Con int&
  8. #define I inline
  9. #define W while
  10. #define N 100000
  11. #define IT vector<int>::iterator
  12. #define pb push_back
  13. using namespace std;
  14. int n,a[N+5],s[N+5];vector<int> v[N+5];
  15. class FastIO
  16. {
  17. private:
  18. #define FS 100000
  19. #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
  20. #define pc(c) (C==E&&(clear(),0),*C++=c)
  21. #define tn (x<<3)+(x<<1)
  22. #define D isdigit(c=tc())
  23. int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
  24. public:
  25. I FastIO() {A=B=FI,C=FO,E=FO+FS;}
  26. Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
  27. Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
  28. Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
  29. I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
  30. }F;
  31. class LinearSieve//线性筛预处理莫比乌斯函数
  32. {
  33. private:
  34. int Pt,P[N+5],mu[N+5];
  35. public:
  36. I int operator [] (CI x) Con {return mu[x];}
  37. I LinearSieve()
  38. {
  39. mu[1]=1;for(RI i=2,j;i<=N;++i)
  40. for(!P[i]&&(mu[P[++Pt]=i]=-1),j=1;j<=Pt&&1LL*i*P[j]<=N;++j)
  41. if(P[i*P[j]]=1,i%P[j]) mu[i*P[j]]=-mu[i];else break;
  42. }
  43. }L;
  44. int main()
  45. {
  46. RI Qt,i,j,op,x,y,t;IT it;for(F.read(n),F.read(Qt),i=1;i<=n;++i)
  47. {
  48. for(F.read(a[i]),j=1;1LL*j*j<=i;++j) !(i%j)&&(v[i].pb(j),i^(j*j)&&(v[i].pb(i/j),0));//预处理约数
  49. for(it=v[i].begin();it!=v[i].end();++it) s[*it]+=a[i];//预处理答案
  50. }
  51. W(Qt--) switch(F.read(op),F.read(x),op)
  52. {
  53. case 1:for(F.read(y),it=v[x].begin();it!=v[x].end();++it) s[*it]+=y-a[x];a[x]=y;break;//单点修改,枚举约数进行修改
  54. case 2:for(t=0,it=v[x].begin();it!=v[x].end();++it) t+=L[*it]*s[*it];F.writeln(t);break;//询问,枚举约数统计答案
  55. }return F.clear(),0;
  56. }

【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)的更多相关文章

  1. Problem b 莫比乌斯反演+枚举除法的取值

    莫比乌斯反演+枚举除法的取值 第二种形式: f(n)表示gcd(x,y)=n的数量. F(n)表示gcd(x,y)是n的倍数的数量. /** 题目:Problem b 链接:https://vjudg ...

  2. [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)有多少对. ...

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

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

  4. 51nod1678 lyk与gcd

    容斥定理所以可以用莫比乌斯函数来搞.逆向思维答案等于总和减去和他互质的.那么设f[i]=∑a[j] i|j.ans[i]=sum- ∑mo[j]*f[j] 跟bzoj2440那道题挺像的都是利用莫比乌 ...

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

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

  6. BZOJ2818: Gcd 莫比乌斯反演

    分析:筛素数,然后枚举,莫比乌斯反演,然后关键就是分块加速(分块加速在上一篇文章) #include<cstdio> #include<cstring> #include< ...

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

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

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

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

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

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

随机推荐

  1. 华为开发者联盟 方舟编译器 DevEco IDE

    华为开发者联盟 https://developer.huawei.com/consumer/cn/ 方舟编译器是为支持多种编程语言.多种芯片平台的联合编译.运行而设计的统一编程平台,包含编译器.工具链 ...

  2. 如何使用coe_load_sql_profile.sql来固定sql profile

    SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile. 1. SQL> -- 对e ...

  3. Linux防火墙常用命令

    Centos7 查看防火墙状态 sudo firewall-cmd --state 输出running则表示防火墙开启,反之则是关闭,也可以使用下面命令进行查询 sudo systemctl stat ...

  4. web测试点集合

    转自:https://blog.csdn.net/yuki_ying/article/details/54946541 web测试点一 .界面检查 进入一个页面测试,首先是检查title,页面排版,字 ...

  5. 每日JAVA面试

  6. java8的捕获多个异常的一个写法

    这是按intellij idea的提示知道的, 可以写成 catch(xxxException | yyyException | zzzException e){ } 这样的形式,对几个不同的异常使用 ...

  7. 09-Node.js学习笔记-异步编程

    同步API,异步API 同步API:只有当前API执行完成后,才能继续执行下一个API console.log('before'); console.log('after'); 异步API:当前API ...

  8. day98_12_2 数据分析工具包。

    1.numpy 在python中,数据分析可以使用numpy. 首先可以安装ipython解释器,在终端,代码变得可视化,界面有高亮显示: pip Install ipython 除了可以在终端编程之 ...

  9. Latex学习与使用

    Table of Contents Latex学习与使用 简介 文档结构 排版 表格 图片 公式 索引 简介 Latex(发音lay-tek)是一个用来产生专业文档的系统,但它并不是一个单词处理器.它 ...

  10. POJ-2018 Authors Register Update your info Authors ranklist

    Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16945   Accepted: 5425 ...