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 additional se ...
- C#复习③
C#复习③ 2016年6月16日 11:13 Main Declaration & Statement 声明和语句 1.一个程序包含的声明空间有哪些? Namespace : declarat ...
- vs2015密钥 企业版 专业版 (vs.net)
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- ArrayList vs LinkedList vs Vector
List概览 List,正如它的名字,表明其是有顺序的.当讨论List的时候,最好拿它跟Set作比较,Set中的元素是无序且唯一:下面是一张类层次结构图,从这张图中,我们可以大致了解java集合类的整 ...
- Hibernate 缓存介绍
Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...
- RFID应用范围
RFID应用范围 (1)物流: 物流过程中的货物追踪,信息自动采集,仓储应用,港口应用,邮政,快递 (2)零售: 商品的销售数据实时统计,补货,防盗 (3)制造业: 生产数据的实时监控,质量追踪,自动 ...
- ORACLE 如何查看索引重建进度情况
在ORACLE数据库中,如果一个比较大的索引在重建过程中耗费时间比较长,那么怎么查看索引重建耗费的时间,以及完成了多少(比例)了呢,我们可以通过V$SESSION_LONGOPS视图来查看索引重建的时 ...
- C#语句1:选择语句一(if else )
语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或“执行流”. 根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 注意,语句间的标点符号必须是英文标点 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- FATAL ERROR: Could not find ./bin/my_print_defaults的解决办法
对mysql数据库初始化过程中,会有如下报错信息: 1 2 3 4 5 6 7 [root@localhost scripts]# ./mysql_install_db --user=mysql FA ...