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-评分,支持我们
一,效果图. 二,工程图. 三,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additi ...
- Mac下载安装Android Studio教程
今天把公司闲置的一台Mac-mini重装了下系统感觉用着速度还不错,平时上班用的机器USB有些问题,所以打算用这台Mac.以往开发用Intellij Idea就够用,但是这次项目引用的jar包太多,遭 ...
- 豆瓣FM 歌词跟随插件
一直在用豆瓣FM,发现老是没有歌词很不方便,今天找了下.找到一个不错的插件. 插件原文地址:http://www.douban.com/group/topic/47559280/ 插件下载地址:htt ...
- Silverlight 调用自托管的wcf 报跨域异常的处理
Sileverlight很多时候需要通过wcf和后台,程序进行交互.如果 iis was托管还好,极端的遇到自托管的程序,console,windowsservice,winform,wpf等,就会出 ...
- jqGrid 学习笔记--数据异步加载方法(转)
var commonQuery = '../importantInfoReport/pageQueryImportantInfoReport.action?type=0'; jQuery(" ...
- A record--Offline deployment of Big Data Platform CDH Cluster
A record--Offline deployment of Big Data Platform CDH Cluster Tags: Cloudera-Manager CDH Hadoop Depl ...
- linux 添加用户、权限
# useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假 ...
- 9、FTP封杀用户、限制传输速率、限制访问目录、为匿名用户提供下载资源
一.封杀某些用户访问FTP服务器 例如 封杀 yanji [root@localhost root]# vi /etc/vsftpd.ftpusers (用户控制配置文件,主要用于限 ...
- 解决AutoCAD2010在VS2010上无法命中断点
AutoCAD 2010的二次开发告一段落,现在整理一些开发中遇到的问题. 最早遇到的问题是关于AutoCAD 2010在VS 2010上无法调试.奇怪的是这问题只出现在我同事电脑上,我的电脑一切OK ...
- 学习OpenStack之 (1):安装devstack
1. 系统准备 ubuntu 12.04 server 虚拟机. 2G内存. 依次运行以下命令来安装git: sudo apt-get update sudo apt-get upgrade sudo ...