51nod lyk与gcd
这天,lyk又和gcd杠上了。
它拥有一个n个数的数列,它想实现两种操作。
1:将 ai 改为b。
2:给定一个数i,求所有 gcd(i,j)=1 时的 aj 的总和。
第一行两个数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)。
对于每个询问输出一行表示答案。
5 3
1 2 3 4 5
2 4
1 3 1
2 4
9
7
思路 考虑辅助数组f[i]表示所有下标为i的倍数的a数组的总和。 例如有5个数,那么f[1]=a[1]+a[2]+a[3]+a[4]+a[5],f[2]=a[2]+a[4],f[3]=a[3],f[4]=a[4],f[5]=a[5]。
利用容斥定理----
先将每个数加到它的约数里---
然后每次利用容斥定理求出和 i 不互素的数的和---
总和-求的和就为所要的解
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
vector <int > sta[];
int shu[];
int ou[],ll;
int qu[],kkp;
LL pp[];
void init(int n)
{
int su[],kp=;
bool fa[];
memset(fa,true,sizeof(fa));
for (int i=;i<=n;i++)
{
if (fa[i])
{
su[kp++]=i;
if (i<=sqrt(n))
for (int j=i*i;j<=n;j+=i)
fa[j]=false;
}
}
for (int i=;i<=n;i++)
{
int ll=;
int kk=i;
for (int j=;su[j]*su[j]<=kk;j++)
{
if (kk%su[j]==)
ou[ll++]=su[j];
while (kk%su[j]==)
kk/=su[j];
}
if (kk>)
ou[ll++]=kk;
kkp=;
qu[kkp++]=-;
for (int j=;j<ll;j++)
{
kk=kkp;
for (int k=;k<kk;k++)
qu[kkp++]=qu[k]*ou[j]*-;
}
for (int j=;j<kkp;j++)
sta[i].push_back(qu[j]);
}
}
int main()
{
int n,k;
/*freopen("In.txt","r",stdin);
freopen("wo.txt","w",stdout);*/
scanf("%d%d",&n,&k);
init(n);
LL s=,ans;
memset(pp,,sizeof(pp));
for (int i=;i<=n;i++)
{
scanf("%d",&shu[i]);
for (int j=;j<sta[i].size();j++)
{
if (sta[i][j]>)
pp[sta[i][j]]+=shu[i];
else
pp[-sta[i][j]]+=shu[i];
}
s+=shu[i];
}
int a,b,c;
while (k--)
{
scanf("%d",&c);
if (c==)
{
scanf("%d%d",&a,&b);
for (int j=;j<sta[a].size();j++)
{
if (sta[a][j]>)
pp[sta[a][j]]-=shu[a];
else
pp[-sta[a][j]]-=shu[a];
}
s-=shu[a];
shu[a]=b;
for (int j=;j<sta[a].size();j++)
{
if (sta[a][j]>)
pp[sta[a][j]]+=shu[a];
else
pp[-sta[a][j]]+=shu[a];
}
s+=shu[a];
}
else
{
scanf("%d",&a);
if (a==)
{
printf("%lld\n",s);
continue;
}
ans=;
for (int i=;i<sta[a].size();i++)
{
if (sta[a][i]<)
ans-=pp[-sta[a][i]];
else
ans+=pp[sta[a][i]];
}
ans=s-ans;
printf("%lld\n",ans);
}
}
return ;
}
这道题是我复制借鉴的http://blog.csdn.net/leibniz_zhang/article/details/52318715这位大佬的 = =
51nod lyk与gcd的更多相关文章
- 51nod 1678 lyk与gcd | 容斥原理
51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...
- 51nod1678 lyk与gcd
容斥定理所以可以用莫比乌斯函数来搞.逆向思维答案等于总和减去和他互质的.那么设f[i]=∑a[j] i|j.ans[i]=sum- ∑mo[j]*f[j] 跟bzoj2440那道题挺像的都是利用莫比乌 ...
- 51 Nod 1678 lyk与gcd
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将 ai ...
- 51 Nod 1678 lyk与gcd(容斥原理)
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作 ...
- 1678 lyk与gcd
1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为b.2:给定一个数i,求所有 ...
- [51nod]1678 lyk与gcd(莫比乌斯反演)
题面 传送门 题解 和这题差不多 //minamoto #include<bits/stdc++.h> #define R register #define pb push_back #d ...
- 51NOD 1594:Gcd and Phi——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1594 参考及详细推导:http://www.cnblogs.com/ri ...
- 【51nod】2026 Gcd and Lcm
题解 话说LOJ说我今天宜学数论= =看到小迪学了杜教筛去蹭了一波小迪做的题 标解的杜教筛的函数不懂啊,怎么推的毫无思路= = 所以写了个复杂度稍微高一点的?? 首先,我们发现f是个积性函数,那么我们 ...
- 【51nod】1594 Gcd and Phi
题解 跟随小迪学姐的步伐,学习一下数论 小迪学姐太巨了! 这道题的式子很好推嘛 \(\sum_{i = 1}^{n} \sum_{j = 1}^{n} \sum_{d|\phi(i),\phi(j)} ...
随机推荐
- c中的关键字、标识符、注释
一. 学习语法之前的提醒 1) C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 2) 就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头, ...
- Mac OS 文件、文件夹重命名的方法
在Mac OS中,文件和文件名重命名的方法非常简单 选中你想要命名的文件或者文件夹,按回车,可以直接重命名,输入你要修改的内容,确认后,再按回车就OK啦--- 希望能对你有所帮助^_^
- ajax页面加载进度条插件
下面两个都是youtube视频的加载进度条效果的ajax插件 一.官网:http://ricostacruz.com/nprogress/官网 github:https://github.com/rs ...
- 面试题整理:C#(二)
1.类,接口的区别 从定义的角度类描述一个实体,包括状态.属性和动作接口定义一类动作,没有实现,也没有状态信息从程序的角度接口是函数声明:类是函数实现接口可以有属性,不能有字段一个子类只能继承一个父类 ...
- 区别和详解:jQuery extend()和jQuery.fn.extend()
1.认识jQuery extend()和jQuery.fn.extend() jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部 ...
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- 0009《SQL必知必会》笔记05-表的创建与约束
1.创建表:用CREATE TABLE 语句,要指明:表名(不能与现有表名重复).列名.每列的数据类型 CREATE TABLE product ( prod_id ), vend_id ), pro ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- InnoDB源码分析--缓冲池(三)
转载请附原文链接:http://www.cnblogs.com/wingsless/p/5582063.html 昨天写到了InnoDB缓冲池的预读:<InnoDB源码分析--缓冲池(二)> ...
- Linux软件的卸载
configure作用:是源码安装软件时配置环境用的 他根据你的配置选项和你的系统情况生成makefile文件 为make 做准备 最常用的参数: ./configure --prefix 作用: 不 ...