1678 lyk与gcd
这天,lyk又和gcd杠上了。
它拥有一个n个数的数列,它想实现两种操作。
1:将 ai 改为b。
2:给定一个数i,求所有 gcd(i,j)=1 时的 aj 的总和。
第一行两个数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)。
对于每个询问输出一行表示答案。
5 3
1 2 3 4 5
2 4
1 3 1
2 4
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的更多相关文章
- 51nod 1678 lyk与gcd | 容斥原理
51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...
- 51 Nod 1678 lyk与gcd
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将 ai ...
- 51 Nod 1678 lyk与gcd(容斥原理)
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作 ...
- [51nod]1678 lyk与gcd(莫比乌斯反演)
题面 传送门 题解 和这题差不多 //minamoto #include<bits/stdc++.h> #define R register #define pb push_back #d ...
- 51nod lyk与gcd
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将 ai ...
- 51nod1678 lyk与gcd
容斥定理所以可以用莫比乌斯函数来搞.逆向思维答案等于总和减去和他互质的.那么设f[i]=∑a[j] i|j.ans[i]=sum- ∑mo[j]*f[j] 跟bzoj2440那道题挺像的都是利用莫比乌 ...
- 【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)
点此看题面 大致题意: 一个长度为\(n\)的数组,实现两种操作:单点修改,给定\(i\)求\(\sum_{j=1}^na_j[gcd(i,j)=1]\). 莫比乌斯反演 考虑推一推询问操作的式子: ...
- 51nod算法马拉松15
智力彻底没有了...看来再也拿不到奖金了QAQ... A B君的游戏 因为数据是9B1L,所以我们可以hash试一下数据... #include<cstdio> #include<c ...
- 51nod部分容斥题解
51nod1434 区间LCM 跟容斥没有关系.首先可以确定的一个结论是:对于任意正整数,有1*2*...*n | (k+1)*(k+2)*...*(k+n).因为这就是$C_{n+k}^{k}$. ...
随机推荐
- 深入理解动态规划DP
通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10 ...
- c#表格序号列
<asp:BoundField HeaderText="序号" /> OnRowCreated="gridview_RowCreated" prot ...
- 日常Java 2021/10/30
Java泛型 Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型.泛型的本质是参数化类型,也就是说所操作的数据类型 ...
- 日常Java 2021/10/17
今天开始Javaweb编译环境调试,从tomcat容器开始,然后mysql的下载,连接工具datagrip,navicat for mysql,然后就是编写自己的sql,安装jdbc,eclipse连 ...
- Docker学习(二)——Docker容器使用
Docker容器使用 1.Docker客户端 命令docker可以查看到Docker客户端的所有命令选项. 命令docker command --help更深入的了解指定的Do ...
- C++ 类型转换(C风格的强制转换):
转https://www.cnblogs.com/Allen-rg/p/6999360.html C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型, ...
- HongYun项目启动
一个前后端分离项目的启动顺序: 数据库启动, stams 后台springboot启动 中间路由启动,比如nginx,如果有的话:有这一层,后台可以设置负载均衡,可以动态部署 前端启动
- RAC中常见的高级用法-过滤
filter 过滤信号,使用它可以获取满足条件的信号. - (void)filter { //只有当我们文本框内容长度大于5才想要获取文本框的内容 [[_passWord.rac_textS ...
- JavaScript实现数组去重方法
一.利用ES6 Set去重(ES6中最常用) function unique (arr) { return Array.from(new Set(arr)) } var arr = [1,1,'tru ...
- 【Matlab】取整函数:fix/round/floor/ceil
fix-向零方向取整.(向中间取整) round-向最近的方向取整.(四舍五入) floor-向负无穷大方向取整.(向下取整) ceil-向正无穷大方向取整.(向上取整)