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}$. ...
随机推荐
- 数据库(database)介绍
0.数据定义:除了文本类型的数据,图像.音乐.声音都是数据. 数据分类:结构化数据.非结构化数据.1.数据库定义:"电子化的文件柜","数据仓库".数据库是一个 ...
- LeetCode移除元素
LeetCode 移除元素 题目描述 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不需要使用额外的数组空间,你必须仅使用 O(1) ...
- Spark中的分区方法详解
转自:https://blog.csdn.net/dmy1115143060/article/details/82620715 一.Spark数据分区方式简要 在Spark中,RDD(Resilien ...
- Hive(十)【窗口函数】
目录 一.定义 窗口函数: 标准聚合函数 分析排名函数 二.语法 (1)窗口函数 over([partition by 字段] [order by 字段] [ 窗口语句]) (2)窗口语句 三.需求练 ...
- 机器学习常用python包
(py37) ai@ai:~$ pip freeze |grep -v '@' astor==0.8.1 certifi==2021.5.30 chardet==4.0.0 cycler==0.10. ...
- minSdkVersion、targetSdkVersion、targetApiLevel的区别
在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion="4" android:targetSdk ...
- docker安装jumpserver
注意MySQL的密码设置要有复杂度,否则jumpserver用不了 #先准备一台服务器安装MySQL和redis(注意官网版本要求) root@ubuntu:~# docker pull mysql: ...
- 【dva】dva的基本用法
services 该文件夹用于存储services,里面的内容为接口调用函数,记得将数据返回.(request是我自己封装函数,也可以用axios原生的函数) const finishTask = { ...
- Windows 任务计划部署 .Net 控制台程序
Windows 搜索:任务计划程序 创建任务 添加任务名称 设置触发器:这里设置每10分钟执行一次 保存之后显示 此任务会从每天的 0:10:00 执行第一次后一直循环下去. 在操作选项卡下,选择启动 ...
- 合并项目(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 在熬肥的世界里,有个大难题,就是多文件合并-- 好吧,以前是大难题,现在,早就不是了,Word有主控文档,Excel有&q ...