基准时间限制: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. 修改Ubuntu中locale转中文为英文

    修改Ubuntu 的命令行为英文版  编辑 /etc/default/locale 文件 原来的配置为: LANG="zh_CN.UTF-8″ LANGUAGE="zh_CN:&q ...

  2. UE4之Slate: App启动与最外层Runtime结构

    UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...

  3. 9 — springboot整合jdbc、druid、druid实现日志监控 — 更新完毕

    1.整合jdbc.druid 1).导入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  4. YYYY-MM-DD引发的问题

    yyyy 和 YYYY 用YYYY格式化代码 2019-12-31 转 YYYY/MM/dd 格式: 2020/12/31 2020-01-01 转 YYYY/MM/dd 格式: 2020/01/01 ...

  5. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

  6. Linux 网卡配置文件,命令详细设置

    1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...

  7. spring中JDBCTemplate的简单应用

    package cn.itcast.datasource.jdbctemplate;import cn.itcast.utils.JDBCUtils;import org.springframewor ...

  8. 【C/C++】最长公共子序列(LCS)/动态规划

    晴神这个的最巧妙之处,在于用dp[i][0] = dp[0][j] = 0的边界条件 这样从1的下标开始填数组的时候,递推公式dp[i-1][j-1]之类的不会报错 #include <iost ...

  9. C/C++语言结构体指针的使用

    C/C++语言结构体指针的使用 主要内容 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使用 指针的使用 代码内容重点 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使 ...

  10. Flink Exactly-once 实现原理解析

    关注公众号:大数据技术派,回复"资料",领取1024G资料. 这一课时我们将讲解 Flink "精确一次"的语义实现原理,同时这也是面试的必考点. Flink ...