【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)
大致题意: 一个长度为\(n\)的数组,实现两种操作:单点修改,给定\(i\)求\(\sum_{j=1}^na_j[gcd(i,j)=1]\)。
莫比乌斯反演
考虑推一推询问操作的式子:
\]
按照莫比乌斯反演的一般套路,我们知道\(\sum_{p|x}\mu(p)=[x=1]\),因此我们枚举一个\(p\):
\]
调整枚举顺序,得到:
\]
考虑到一个数的约数个数很少,所以我们可以直接枚举\(p\),然后只要维护满足\(p|j\)的\(a_j\)之和,就可以求出答案。
则我们可以发现,同样因为一个数的约数个数很少,单点修改时,我们可以枚举所修改位置的编号的约数并修改每个约数的答案,这样就能实现维护了。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define IT vector<int>::iterator
#define pb push_back
using namespace std;
int n,a[N+5],s[N+5];vector<int> v[N+5];
class FastIO
{
	private:
		#define FS 100000
		#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
		#define pc(c) (C==E&&(clear(),0),*C++=c)
		#define tn (x<<3)+(x<<1)
		#define D isdigit(c=tc())
		int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
	public:
		I FastIO() {A=B=FI,C=FO,E=FO+FS;}
		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
		Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
		Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
		I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
}F;
class LinearSieve//线性筛预处理莫比乌斯函数
{
	private:
		int Pt,P[N+5],mu[N+5];
	public:
		I int operator [] (CI x) Con {return mu[x];}
		I LinearSieve()
		{
			mu[1]=1;for(RI i=2,j;i<=N;++i)
				for(!P[i]&&(mu[P[++Pt]=i]=-1),j=1;j<=Pt&&1LL*i*P[j]<=N;++j)
					if(P[i*P[j]]=1,i%P[j]) mu[i*P[j]]=-mu[i];else break;
		}
}L;
int main()
{
	RI Qt,i,j,op,x,y,t;IT it;for(F.read(n),F.read(Qt),i=1;i<=n;++i)
	{
		for(F.read(a[i]),j=1;1LL*j*j<=i;++j) !(i%j)&&(v[i].pb(j),i^(j*j)&&(v[i].pb(i/j),0));//预处理约数
		for(it=v[i].begin();it!=v[i].end();++it) s[*it]+=a[i];//预处理答案
	}
	W(Qt--) switch(F.read(op),F.read(x),op)
	{
		case 1:for(F.read(y),it=v[x].begin();it!=v[x].end();++it) s[*it]+=y-a[x];a[x]=y;break;//单点修改,枚举约数进行修改
		case 2:for(t=0,it=v[x].begin();it!=v[x].end();++it) t+=L[*it]*s[*it];F.writeln(t);break;//询问,枚举约数统计答案
	}return F.clear(),0;
}
												
											【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)的更多相关文章
- Problem b 莫比乌斯反演+枚举除法的取值
		
莫比乌斯反演+枚举除法的取值 第二种形式: f(n)表示gcd(x,y)=n的数量. F(n)表示gcd(x,y)是n的倍数的数量. /** 题目:Problem b 链接:https://vjudg ...
 - [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
		
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
 - HDU1695 GCD(莫比乌斯反演)
		
传送门 看了1个多小时,终于懂了一点了 题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数 思路:令F(i)表示i|gcd(x,y)的 ...
 - 51nod1678 lyk与gcd
		
容斥定理所以可以用莫比乌斯函数来搞.逆向思维答案等于总和减去和他互质的.那么设f[i]=∑a[j] i|j.ans[i]=sum- ∑mo[j]*f[j] 跟bzoj2440那道题挺像的都是利用莫比乌 ...
 - hdu 1695 GCD 莫比乌斯反演入门
		
GCD 题意:输入5个数a,b,c,d,k;(a = c = 1, 0 < b,d,k <= 100000);问有多少对a <= p <= b, c <= q <= ...
 - BZOJ2818: Gcd   莫比乌斯反演
		
分析:筛素数,然后枚举,莫比乌斯反演,然后关键就是分块加速(分块加速在上一篇文章) #include<cstdio> #include<cstring> #include< ...
 - 洛谷P2257 YY的GCD 莫比乌斯反演
		
原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...
 - HYSBZ - 2818 Gcd (莫比乌斯反演)
		
莫比乌斯反演的入门题,设 \(F(x): gcd(i,j)\%x=0\) 的对数,\(f(x): gcd(i,j)=x\)的对数. 易知\[F(p) = \lfloor \frac{n}{p} \rf ...
 - 【BZOJ2818】Gcd [莫比乌斯反演]
		
Gcd Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 给定整数N,求1<=x,y&l ...
 
随机推荐
- JS PopupAlert
			
JS PopupAlert 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行 ...
 - Python 函数和类
			
python作为一个面向对象的语言,也有类似java等面向对象语言相同的数据结构(class)的定义,和代码块数据结构定义"函数".为了极大可能的简化代码调用逻辑和书写规则,pyt ...
 - Reinforcement Learning by Sutton 第三章习题答案
			
好不容易写完了 想看全部的欢迎点击下面的github https://github.com/LyWangPX/Solutions-of-Reinforcement-Learning-An-Introd ...
 - 由随机数rand5实现随机数rand7
			
rand5表示生成随机数1,2,3,4,5 rand7表示生成随机数1,2,3,4,5,6,7 要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5 rand7生成 ...
 - python语言程序设计基础(第二版)第五章答案随笔
			
1.实现isOdd()函数,参数为整数,如果整数是奇数,返回True,否则返回False def isOdd(num): if num % 2 == 0: return True ...
 - sublime插件开发教程1
			
学习sublime插件开发 好处有很多 比方说微信小程序插件 他官方自带的功能太鸡肋了 可以开发个sublime插件 写智能提示 甩掉微信几条街 sublime插件是用python开发的 所以学习s ...
 - Web前端基础(13):JavaScript(七)
			
1. BOM JavaScript基础分为三部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的元 ...
 - PlayJava Day017
			
今日所学: /* 2019.08.19开始学习,此为补档. */ 1.数组变量 a.数组变量是数组的管理者而非数组本身 b.数组必须创建出来然后交给数组变量来管理 c.数组变量之间的赋值是管理权限的赋 ...
 - 页面QQ临时对话的实现
			
一.开通QQ服务 点我进入QQ推广官网>然后点击推广工具即可后面自己看中文 二.页面a标签 <a target="_blank" href="http://w ...
 - Java操作数据库——在JDBC里使用事务
			
Java操作数据库——在JDBC里使用事务 摘要:本文主要学习了如何在JDBC里使用事务. 使用Connection的事务控制方法 当JDBC程序向数据库获得一个Connection对象时,默认情况下 ...