基准时间限制: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. karatsuba乘法

    karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1] 此算法主要用于两个 ...

  2. 类成员函数调用delete this会发生什么呢?

    有如下代码 class myClass { public: myClass(){}; ~myClass(){}; void foo() { delete this; } }; int main() { ...

  3. 初学js正则表达式之密码强度验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

  5. 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

    大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...

  6. ORACLE lag,lead

    oracle中想取对应列前几行或者后几行的数据时可以使用lag和lead分析函数 lag:是滞后的意思,表示本行数据是要查询的数据后面,即查询之前行的记录. lead:是领队的意思,表示本行数据是要查 ...

  7. 前端两大框架 vue 和 react 的区别

    1. 设计思想 vue: vue的官网介绍说vue是一种渐进式框架,采用自底向上增量开发的设计: react: 采用函数式编程,推崇纯组件,数据不可变,单向数据流: 2. 编写语法 vue: 采用单文 ...

  8. react中在hooks方法useEffect中加载异步数据

    useEffect( ()=>{ (async function getPipeList(value:any) { let result= await GetPipeList(value); s ...

  9. java实现文件压缩

    java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...

  10. 【Java 基础】Java Enum

    概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承jav ...