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)} ...
随机推荐
- 【读书笔记】iOS-ARC-Xcode检测循环引用
一,在桌面上新建立一个工程,在ViewController.m中输入如下代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additio ...
- Android实用代码七段(五)
前言 每次分享意味着每次都有进步,本系列以实用为主,欢迎和我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯 ...
- IOS开发之开发者账号遇到的bug
今天使用开发者账号过期的问题,文件显示 其实今天的问题和这个没有关系,即使上面显示此证书的签发者无效,有时候也是可以用的. 我这里情况比较奇葩,刚刚生成的开发者账号,显示还是"......无 ...
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- 4、解决native库不兼容
解决native库不兼容 现象: 报警告 [root@hadoop1 hadoop-]# bin/hdfs dfs -ls /input // :: WARN util.NativeCodeLoade ...
- 烂泥:vcenter通过模板部署vm
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前一篇文章我们介绍了有关vcenter5.5的安装与配置,这篇文章我们再来介绍下,如何 ...
- andriod fragment调用Activity函数方法
(1)新增一个activity public MainActivity getMainActivity(); } (2)在MainActivity 的Java文件中增加 getMainActivit公 ...
- eclipse设置显示代码行数(转)
(转自:http://jingyan.baidu.com/article/b2c186c89b7023c46ef6ff27.html) 载入eclipse的主页面,默认以英文版的eclipse为例 点 ...
- Bootstrap 学习(1)
简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷. Bootst ...
- IOS中修改图片的大小:修改分辨率和裁剪
在IOS开发中,经常有限制图片文件大小的,有的用户图片很大,导致上传时间慢,造成问题. 如:微信分享中,如果图片的大小好像大于50kbytes,就分享失败,而且没有任何提示. 所以,我添加了两个函数: ...