基准时间限制:2 秒 空间限制:131072 KB

这天,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
思路:容斥原理;
我们用容斥将每个数的质因子,然后将其所对应的数加到表中,奇加偶减,然后分解当前的询问的数,然后可以重表中找出那些和他不互质的所对应的书数的和,然后总的减去即可。
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<queue>
6 #include<string.h>
7 #include<math.h>
8 #include<map>
9 using namespace std;
10 typedef long long LL;
11 int ans[100000];
12 bool prime[100005];
13 LL cnt[100005];
14 int ak[100005];
15 int tt[200];
16 void table(int n,int cn,int v);
17 LL ac(int n);
18 int main(void)
19 {
20 int N,Q;
21 int i,j;
22 for(i = 2; i < 1000; i++)
23 {
24 if(!prime[i])
25 {
26 for(j = i; i*j < 100000; j++)
27 {
28 prime[i*j] = true;
29 }
30 }
31 }
32 int cn = 0;
33 for(i = 2; i < 100000; i++)
34 {
35 if(!prime[i])
36 {
37 ans[cn++] = i;
38 }
39 }
40 scanf("%d %d",&N,&Q);
41 LL sum = 0;
42 for(i = 1; i <= N; i++)
43 {
44 scanf("%d",&ak[i]);
45 sum += ak[i];
46 table(i,cn,1);
47 }//printf("%lld\n",sum);
48 for(i = 0; i < Q; i++)
49 {
50 int val;
51 int c;
52 scanf("%d",&val);
53 if(val == 2 )
54 {
55 scanf("%d",&c);
56 printf("%lld\n",sum-ac(c));
57 }
58 else
59 {
60 int x,y;
61 scanf("%d %d",&x,&y);
62 table(x,cn,0);
63 sum -= ak[x];
64 ak[x] = y;
65 sum += ak[x];
66 table(x,cn,1);
67 }
68 }
69 return 0;
70 }
71 void table(int n,int cn,int v)
72 {
73 int f = 0;
74 bool flag = false ;
75 int x = n;
76 int cp = 0;
77 while(x > 1)
78 {
79 while(x%ans[f]==0)
80 {
81 if(!flag)
82 {
83 flag = true;
84 tt[cp++] = ans[f];
85 }
86 x/=ans[f];
87 }
88 f++;
89 flag = false ;
90 if(ans[f]*ans[f]>x)
91 break;
92 }
93 if(x>1)
94 tt[cp++] = x;
95 int i,j;
96 for(i = 1; i < (1<<cp); i++)
97 {
98 int sum = 1;int t = 0;
99 for(j = 0; j < cp; j++)
100 {
101 if(i&(1<< j))
102 {
103 sum*=tt[j];
104 t++;
105 }
106 }
107 if(v)
108 {
109 if(t%2)cnt[sum]+=ak[n];
110 else cnt[sum]-=ak[n];
111 }
112 else
113 {
114 if(t%2)cnt[sum]-=ak[n];
115 else cnt[sum]+=ak[n];
116 }
117 }
118 }
119 LL ac(int n)
120 {
121 int f = 0;
122 bool flag = false ;
123 int x = n;
124 int cp = 0;
125 while(x > 1)
126 {
127 while(x%ans[f]==0)
128 {
129 if(!flag)
130 {
131 flag = true;
132 tt[cp++] = ans[f];
133 }
134 x/=ans[f];
135 }
136 f++;
137 flag = false ;
138 if(ans[f]*ans[f]>x)
139 break;
140 }
141 if(x>1)
142 tt[cp++] = x;
143 int i,j;
144 LL k = 0;;
145 for(i = 1; i < (1<<cp); i++)
146 {
147 int sum = 1;
148 for(j = 0; j < cp; j++)
149 {
150 if(i&(1<<j))
151 {
152 sum *= tt[j];
153 }
154 }
155 k += cnt[sum];
156 }//printf("%lld\n",k);
157 return k;
158 }

1678 lyk与gcd的更多相关文章

  1. 51nod 1678 lyk与gcd | 容斥原理

    51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...

  2. 51 Nod 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  3. 51 Nod 1678 lyk与gcd(容斥原理)

    1678 lyk与gcd  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作 ...

  4. [51nod]1678 lyk与gcd(莫比乌斯反演)

    题面 传送门 题解 和这题差不多 //minamoto #include<bits/stdc++.h> #define R register #define pb push_back #d ...

  5. 51nod lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  6. 51nod1678 lyk与gcd

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

  7. 【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)

    点此看题面 大致题意: 一个长度为\(n\)的数组,实现两种操作:单点修改,给定\(i\)求\(\sum_{j=1}^na_j[gcd(i,j)=1]\). 莫比乌斯反演 考虑推一推询问操作的式子: ...

  8. 51nod算法马拉松15

    智力彻底没有了...看来再也拿不到奖金了QAQ... A B君的游戏 因为数据是9B1L,所以我们可以hash试一下数据... #include<cstdio> #include<c ...

  9. 51nod部分容斥题解

    51nod1434 区间LCM 跟容斥没有关系.首先可以确定的一个结论是:对于任意正整数,有1*2*...*n | (k+1)*(k+2)*...*(k+n).因为这就是$C_{n+k}^{k}$. ...

随机推荐

  1. 网站性能调优实战-学相伴KuangStudy

    面对并发我们是如何优化KuangStudy网站性能的? 每个项目都会随着用户和数据的增长调整架构,来面对未来的问题,我们也不例外,在1月5号我们平台正式公测后,引起了很多观众的热烈反响,仅仅4天,注册 ...

  2. 【题解】洛谷P1001 A+B Problem

    第一篇博客,献给2020年的残夏. 静听8月的热情与安宁,在竞赛中的时光如白驹过隙. 也不惧未知的风雨,努力向着既往的通途. 题目地址 https://www.luogu.com.cn/problem ...

  3. C++中Try Catch中的继承

    1.C++中Try Catch简介:我们编译运行程序出错的时候,编译器就会抛出异常.抛出异常要比终止程序灵活许多. 而C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序 ...

  4. a这个词根

    a是个词根,有三种意思:1. 以某种状态或方式,如: ablaze, afire, aflame, alight, aloud, alive, afloat等2. at, in, on, to sth ...

  5. Java偏向锁浅析

    偏向锁的定义 顾名思义,偏向锁会偏向第一个访问锁的线程. 如果在接下来的运行过程中,该锁没有被其他线程访问,这持有偏向锁的线程将永远不需要同步 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线 ...

  6. IDEA中对代码进行测试

    一. 建立对应得目录 二.导入junit依赖 <dependency> <groupId>junit</groupId> <artifactId>jun ...

  7. pyqt5 改写函数

    重新改写了keyPressEvent() class TextEdit(QTextEdit): def __init__(self): QtWidgets.QTextEdit.__init__(sel ...

  8. oracle加密encrypt,解密decrypt

    目录 oracle加密encrypt,解密decrypt 加密 解密 oracle加密encrypt,解密decrypt 有的oracle版本没有加解密函数,以下操作可以手动添加 oracle数据使用 ...

  9. linux 常用清空文件方法

    1.vim 编辑器 vim /tmp/file :1,$d  或 :%d 2.cat 命令 cat /dev/null > /tmp/file

  10. hadoop accesscontrolException

    DFS loaction: /tmp 文件下的 hadoop-haoop/mapred/system报 AccessControlException. 解决: bin/hadoop fs -chmod ...