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. Unity — — UGUI之背包物品拖放

    最新背包代码: Unity3D — — UGUI之简易背包 Unity版本:2017.3 功能:用UGUI实现简单的背包物品拖放/交换功能 一.简介 在UGUI下,物品的拖放脚本实现主要依赖于Unit ...

  2. Table 组件构建过程中遇到的问题与解决思路

    在 GearCase 开源项目构建 Table 组件的过程中.遇到了各式各样的问题,最后尝试了各种方法去解决这些问题. 遇到的部分问题 checkbox 的全选和半选问题 table 组件的排序请求方 ...

  3. Bitcoin Core P2P网络层

    目录 数据结构 节点发现和节点连接 地址管理 节点发现 节点连接 插口(Sockets)和消息 Socket线程 (net.cpp) 消息线程 ProcessMessages (net_process ...

  4. Trait 是什么东西

    PHP官方手册里面写的内容是 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少 ...

  5. aircrack-ng无线破解实验

    查看无线网卡 airmon-ng 开启网卡监听模式 airmon-ng start wlan0 扫描附近的wifi airodump-ng wlan0mon 停止扫描: ctrl c 使用airodu ...

  6. tomcat安装及使用详解

    常用软件安装及使用目录 资料链接:https://pan.baidu.com/s/1XOUlneFqt-_1tOLSmc-E1g     网盘分享的文件在此 1. Tomcat简介 Tomcat是一个 ...

  7. React 之容器组件和展示组件相分离解密

    Redux 的 React 绑定库包含了 容器组件和展示组件相分离 的开发思想.明智的做法是只在最顶层组件(如路由操作)里使用 Redux.其余内部组件仅仅是展示性的,所有数据都通过 props 传入 ...

  8. MathExam6317

    自己取一个大气又可爱的标题 小学二年级的还没来得及写,大部分时间还是花在巩固和查阅新旧知识上了,通过看学习视频,查资料,看博客园的博客...下次完善好了交上. 一.预估与实际 PSP2.1 Perso ...

  9. 人and绩效and职业道德

    人行走在这个世界上 避免不了的是各种悲哀 人就像是一个茶几 上面放满了各种杯具 而要做的是要么把杯具打碎了咽下去,要么被杯具打晕 本布衣 躬耕于南阳 不求闻达于诸侯 每个人都可以选择自己的生活方式 或 ...

  10. 编程之法section II: 2.2 和为定值的两个数

    ====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...