1678 lyk与gcd
基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

这天,lyk又和gcd杠上了。
它拥有一个n个数的数列,它想实现两种操作。

1:将  ai 改为b。
2:给定一个数i,求所有 gcd(i,j)=1 时的  aj  的总和。

Input
第一行两个数n,Q(1<=n,Q<=100000)。
接下来一行n个数表示ai(1<=ai<=10^4)。
接下来Q行,每行先读入一个数A(1<=A<=2)。
若A=1,表示第一种操作,紧接着两个数i和b。(1<=i<=n,1<=b<=10^4)。
若B=2,表示第二种操作,紧接着一个数i。(1<=i<=n)。
Output
对于每个询问输出一行表示答案。
Input示例
5 3
1 2 3 4 5
2 4
1 3 1
2 4
Output示例
9
7思路 

考虑辅助数组f[i]表示所有下标为i的倍数的a数组的总和。

例如有5个数,那么f[1]=a[1]+a[2]+a[3]+a[4]+a[5],f[2]=a[2]+a[4],f[3]=a[3],f[4]=a[4],f[5]=a[5]。
对于每一个修改操作,我们只需要求出i的所有因数,然后将下标为它的因数的f数组中修改值即可。
对于所有询问操作,求出i的所有因数p1,p2,p3...之后答案即为Σu[pi]*f[pi]。
其中u为mobius函数。
总复杂度为所有操作中i的因数个数总和。

利用容斥定理----

先将每个数加到它的约数里---

然后每次利用容斥定理求出和 i 不互素的数的和---

总和-求的和就为所要的解

#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
vector <int > sta[200100];
int shu[220000];
int ou[100],ll;
int qu[200100],kkp;
LL pp[200100];
void init(int n)
{  int su[200100],kp=0;  bool fa[200100];  memset(fa,true,sizeof(fa));  for (int i=2;i<=n;i++)  {  if (fa[i])  {  su[kp++]=i;  if (i<=sqrt(n))  for (int j=i*i;j<=n;j+=i)  fa[j]=false;  }  }  for (int i=2;i<=n;i++)  {  int ll=0;  int kk=i;  for (int j=0;su[j]*su[j]<=kk;j++)  {  if (kk%su[j]==0)  ou[ll++]=su[j];  while (kk%su[j]==0)  kk/=su[j];  }  if (kk>1)  ou[ll++]=kk;  kkp=0;  qu[kkp++]=-1;  for (int j=0;j<ll;j++)  {  kk=kkp;  for (int k=0;k<kk;k++)  qu[kkp++]=qu[k]*ou[j]*-1;  }  for (int j=1;j<kkp;j++)  sta[i].push_back(qu[j]);  }
}
int main()
{  int n,k;  /*freopen("In.txt","r",stdin); freopen("wo.txt","w",stdout);*/  scanf("%d%d",&n,&k);  init(n);  LL s=0,ans;  memset(pp,0,sizeof(pp));  for (int i=1;i<=n;i++)  {  scanf("%d",&shu[i]);  for (int j=0;j<sta[i].size();j++)  {  if (sta[i][j]>0)  pp[sta[i][j]]+=shu[i];  else  pp[-sta[i][j]]+=shu[i];  }  s+=shu[i];  }  int a,b,c;  while (k--)  {  scanf("%d",&c);  if (c==1)  {  scanf("%d%d",&a,&b);  for (int j=0;j<sta[a].size();j++)  {  if (sta[a][j]>0)  pp[sta[a][j]]-=shu[a];  else  pp[-sta[a][j]]-=shu[a];  }  s-=shu[a];  shu[a]=b;  for (int j=0;j<sta[a].size();j++)  {  if (sta[a][j]>0)  pp[sta[a][j]]+=shu[a];  else  pp[-sta[a][j]]+=shu[a];  }  s+=shu[a];  }  else  {  scanf("%d",&a);  if (a==1)  {  printf("%lld\n",s);  continue;  }  ans=0;  for (int i=0;i<sta[a].size();i++)  {  if (sta[a][i]<0)  ans-=pp[-sta[a][i]];  else  ans+=pp[sta[a][i]];  }     ans=s-ans;  printf("%lld\n",ans);  }  }  return 0;
}  

View Code

这道题是我复制借鉴的http://blog.csdn.net/leibniz_zhang/article/details/52318715 这位大佬的 = =

转载于:https://www.cnblogs.com/ruojisun/p/6053113.html

51nod lyk与gcd相关推荐

  1. [51nod1678]lyk与gcd问题

    这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将  a i    改为b. 2:给定一个数i,求所有 gcd(i,j)=1   时的  a j     的总和. In ...

  2. 51NOD 1594:Gcd and Phi——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1594 参考及详细推导:http://www.cnblogs.com/ri ...

  3. 51NOD 2026:Gcd and Lcm——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=2026 参考及推导:https://www.cnblogs.com/ivo ...

  4. 51nod 1575 Gcd and Lcm

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1575 万年巨坑终于填掉了-- 首先是煞笔西瓜的做题历程O_O. ...

  5. 51nod 1011 最大公约数GCD

    输入2个正整数A,B,求A与B的最大公约数. 收起 输入 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) 输出 输出A与B的最大公约数. 输入样例 30 105 输出样例 ...

  6. 【51nod2026】Gcd and Lcm(杜教筛)

    题目传送门:51nod 我们可以先观察一下这个$f(x)=\sum_{d|x}\mu(d) \cdot d$. 首先它是个积性函数,并且$f(p^k)=1-p \ (k>0)$,这说明函数$f( ...

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

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

  8. 51nod 1118 机器人走方格 解题思路:动态规划 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  9. 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)

    51nod 1847 奇怪的数学题 求解∑i=1n∑j=1nsgcd(i,j),sgcd\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j),sgcd∑i=1n​∑j=1n​sgcd(i ...

最新文章

  1. Windows下安装Mongodb SpringBoot集成MongoDB和Redis多数据源
  2. Android --- android.view.InflateException: Binary XML file line #7: Binary XML file lin... 类似问题的解决办法
  3. 将DataFrame数据如何写入到Hive表中
  4. 真希望永远用不到这些代码
  5. create-react-app 创建react项目 多页面应用
  6. js定时器和linux命令locate
  7. 首届中国信息通信大数据大会将于4月20-21日在京召开
  8. (90)常见伪路径约束情景
  9. SpringBoot之Filter过滤器的实现及排序问题
  10. 用virtualenv建立独立虚拟环境 批量导入模块信息
  11. 计算机网络笔记(王道考研) 第一章:计算机网络体系结构
  12. 详解数论从入门到入土
  13. umiJs_React学习笔记
  14. matlab的火山图,Python数据可视化-火山图的绘制
  15. Netd 服务注册过程(Android 10)
  16. js 时间转换、 向上保留两位小数
  17. 89.破碎的玻璃横幅
  18. libjpeg库和libpng库的移植和使用
  19. 【考研资料】计算机/软件超过百所大学的考研初试复试资料!
  20. python如何求阶乘_python如何求阶乘

热门文章

  1. 二手交易管理系统SSM
  2. java线程池介绍(一)
  3. python之利用Pygal+2010年世界人口=绘制世界地图
  4. 英文诗歌 学习 月是故乡明
  5. 10个优质免费PPT模板下载网站推荐
  6. 包青天 - 乞丐王孙(4) 片段 - 堂审河南荥县县令马松友
  7. Java项目对接天眼查
  8. 怎么做成html网页,html网页制作的基本步骤?怎么用html做一个网页?
  9. 【CEC2017】CEC2017优化算法目标测试函数综述以及CEC2017的matlab实现
  10. vivox9android版本升级,vivo X9s是什么系统