51nod 200题辣ψ(`∇´)ψ !庆祝!


51nod 1678 lyk与gcd | 容斥原理

题面

这天,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

题解

我们维护sum[j]表示\(\sum_{k = 1}^{n/j} a[k*j]\),即所有j的倍数位置上的数之和。

题目要求\(gcd(i, j) = 1\), 就是要求总和去掉所有与i有公约数的位置上的数。

那么通过sum数组和容斥原理可以求出来“所有与i有公约数的位置上的数”之和:

sum[第一个质因数] + sum[第二个质因数] + ... - sum[第一个质因数第二个质因数] - sum[第二个质因数 * 第三个质因数] - ... + sum[第一个质因数第二个质因数*第三个质因数]……

总之,可以枚举i的所有满足组成该数的每个质因数在该数中只出现一次的因数,然后如果这个因数中质因数总个数为奇数则加上它的sum,否则减去它的sum,就能求出“所有与i有公约数的位置上的数”之和了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
bool read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
else if(c == EOF) return 0;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
return 1;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 100005;
int n, q, op, pos, val;
int sum[N], cnt[N], a[N];
bool np[N], mul[N]; void init(){
np[0] = np[1] = 1;
for(int i = 2; i <= n; i++)
if(!np[i]){
cnt[i] = 1;
for(int j = 2; i * j <= n; j++){
np[i * j] = 1;
cnt[i * j]++;
if(j % i == 0) mul[i * j] = 1;
}
}
}
void add(int i, int x){
for(int j = 1; j * j <= i; j++)
if(i % j == 0){
sum[j] += x - a[i];
if(j * j != i) sum[i / j] += x - a[i];
}
a[i] = x;
}
void query(int i){
ll ret = 0;
for(int j = 1; j * j <= i; j++)
if(i % j == 0){
if(j > 1 && !mul[j]) ret += (cnt[j] & 1) ? sum[j] : -sum[j];
if(j * j != i && !mul[i / j]) ret += (cnt[i / j] & 1) ? sum[i / j] : -sum[i / j];
}
write(sum[1] - ret), enter;
}
int main(){
read(n), read(q);
init();
for(int i = 1; i <= n; i++)
read(val), add(i, val);
while(q--){
read(op), read(pos);
if(op == 1) read(val), add(pos, val);
else query(pos);
}
return 0;
}

51nod 1678 lyk与gcd | 容斥原理的更多相关文章

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

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

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

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

  3. 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai 改为b.2:给定一个数i,求所有 ...

  4. 51 Nod 1678 lyk与gcd

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

  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. 51nod 1486 大大走格子(容斥原理)

    1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...

  8. HDU 1695 GCD#容斥原理

    http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...

  9. hdu1695 GCD 容斥原理

    Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) ...

随机推荐

  1. ThreadPoolExecutor 使用说明

    它是一个ExecutorService,使用线程池中的线程执行提交的任务.通常我们使用Executors框架,定义使用. 线程池主要用来解决两类问题:通过缓存一定数量的可用线程,避免频繁的线程创建,销 ...

  2. 机器学习基础 --- pandas的基本使用

    一.pandas的简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些 ...

  3. ffplay.exe操作方式

    大牛博客: 博文名称:[总结]FFMPEG视音频编解码零基础学习方法 博文链接:http://blog.csdn.net/leixiaohua1020/article/details/15811977 ...

  4. Python操作数据库之 MySQL

    Python操作数据库之MySQL 一.安装Python-MySQLdb模块 Python-MySQLdb是一个操作数据库的模块,Python 通过它对 mysql 数据实现各种操作. 如果要源码安装 ...

  5. Docker容器和本机之间的文件传输 使用Docker部署Tomcat项目

    Docker容器和本机之间的文件传输. http://blog.csdn.net/leafage_m/article/details/72082011 使用Docker部署Tomcat项目 http: ...

  6. Linux下lshw,lsscsi,lscpu,lsusb,lsblk硬件查看命令

    Linux下lshw,lsscsi,lscpu,lsusb,lsblk硬件查看命令 2016-12-14 何敏杰 1条评论 544次浏览   注意:如有提示命令找不到command not found ...

  7. so easy, too happy

    一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate • 估计这个任务需要多 ...

  8. Java程序设计第四次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

  9. MFC按钮、列表控件应用实例(一)

    需求:实现张三.李四.王五 3 人的课程选择,并将选课结果提交到列表框中显示. 实现过程: 1.建立对话框mfc工程. 2.添加控件 tab 顺序 控 件 类 型 控件 ID1 Button IDC_ ...

  10. eg_6

    问题描述: 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I Demo1: import java.util.Scanner; ...