【HDU4947】GCD Array(莫比乌斯反演+树状数组)
大致题意: 一个长度为\(n\)的数组,实现两种操作:将满足\(gcd(i,k)=d\)的\(a_i\)加上\(v\),询问\(\sum_{i=1}^xa_i\)。
对于修改操作的推式子
莫比乌斯反演真是个神奇而又有趣的东西......
考虑修改操作是将满足\(gcd(i,k)=d\)的\(a_i\)加上\(v\),则若\(d\not| k\),显然是不存在满足条件的\(i\)的,可以直接忽略这一修改操作(忘记判断结果调到心态爆炸......)
否则,也就相当于:
\]
将\([gcd(i\cdot d,k)=d]\)转化,即三个数同时除以\(d\),得到:
\]
根据\(\sum_{p|x}\mu(p)=[x=1]\)这一性质,我们就可以将上述式子再次变形,得到:
\]
因为原式中\(p|\frac id\)这一限制等同于\((p\cdot d)|i\),所以就等同于:
\]
如果我们枚举满足\(p|\frac kd\)的\(p\),并增开一个辅助数组\(f\),每次修改操作就相当于修改\(f\):
\]
那么对于\(a_i\),其实就可以得到:
\]
对于询问操作的推式子
题目询问我们\(\sum_{i=1}^xa_i\)。
由之前推出的式子我们知道:
\]
所以,答案就是:
\]
调整枚举顺序,先枚举\(j\),得到:
\]
所以,我们可以先除法分块,并利用树状数组实现对\(f\)的区间求和,即可得出答案了。
代码
#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 200000
#define LL long long
#define pb push_back
using namespace std;
int n;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 put_case(CI x) {pc(67),pc(97),pc(115),pc(101),pc(32),pc(35),write(x),pc(58),pc(10);}
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;
}
}Mu;
class TreeArray//树状数组实现单点修改、区间求和
{
private:
LL a[N+5];
public:
I void Clear() {memset(a,0,sizeof(a));}
I void Add(RI x,CI y) {W(x<=n) a[x]+=y,x+=x&-x;}
I LL Qry(RI x,LL t=0) {W(x) t+=a[x],x-=x&-x;return t;}
}T;
int main()
{
RI Tt=0,Qt,op,x,y,z,l,r;LL t;vector<int>::iterator it;
for(RI i=1,j;i<=N;++i) if(Mu[i]) for(j=i;j<=N;j+=i) v[j].pb(i);//预处理约数,注意μ=0可忽略
W(F.read(n),F.read(Qt),n&&Qt)
{
F.put_case(++Tt),T.Clear();W(Qt--) switch(F.read(op),F.read(x),op)
{
case 1:if(F.read(y),F.read(z),x%y) continue;x/=y;//注意判断不整除情况直接跳过
for(it=v[x].begin();it!=v[x].end()&&*it*y<=n;++it) T.Add(*it*y,Mu[*it]*z);break;//枚举约数在树状数组上修改
case 2:for(t=0,l=1;l<=x;l=r+1) r=x/(x/l),t+=(T.Qry(r)-T.Qry(l-1))*(x/l);F.writeln(t);break;//除法分块+树状数组求答案
}
}return F.clear(),0;
}
【HDU4947】GCD Array(莫比乌斯反演+树状数组)的更多相关文章
- 【HDU4947】GCD Array (莫比乌斯反演+树状数组)
BUPT2017 wintertraining(15) #5H HDU- 4947 题意 有一个长度为l的数组,现在有m个操作,第1种为1 n d v,给下标x 满足gcd(x,n)=d的\(a_x\ ...
- HDU4947GCD Array(莫比乌斯反演+树状数组)
题面 传送门 题解 orz ljz 相当于每一个数要加上 \[v\times [\gcd(i,n)=d]=v\times [\gcd(i/d,n/d)=1]=v\times \sum_{p|{i\ov ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...
- BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组
$ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...
- 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
随机推荐
- Penetration testing“Linux install Nessus”
Ax_Download www.tenable.com/products/nessus-home,need sent email. Bx_Install su ls dpkg -i [filename ...
- 使用 Apache FOP 2.3 + docbook-xsl-ns-1.79.1 转换 Docbook 5.1 格式的 XML 文档成 PDF/RTF 文件
使用 Docbook 编写折桂打印平台系统.折桂上传平台系统的产品文档,原因基于如下两点: 第一,文档的不同章节,可使用不同的 .xml 文件,由不同人员分别撰写,图片文件在XML文章中用相对目录方式 ...
- 测试工程师如何使用 CODING 进行测试管理
CODING 为您的企业提供从概念到软件开发再到产品发布的全流程全周期软件研发管理,为您的研发团队提供全程助力,帮助研发团队捋清需求.不断迭代.快速反馈并能实时追踪项目进度直到完成.同时 CODING ...
- DSP编程与调试总结
(1)error: can't allocate .ebss, size 000c450d (page 1) in DXINTFRAM2 (avail: 00010000) error: errors ...
- 使用webstrom开发小程序要做的设置
1.关闭rpx的错误提示 在setting里面 -->搜索inspections --> 在右侧找到invalid CSS property value 把对勾划掉
- redis为什么是单线程而且速度快?
redis支持的5种数据类型: 1.String(字符串) 2.List(数组或列表) 3.Set(集合) 4.Hash(哈希或字典) 5.ZSet(有序集合) 数据库的工作模式按存储方式可分为: 硬 ...
- 记一次排查jacoco的过程:java.lang.NoSuchMethodException:ApplyOrderdetail.get$jacocoData()
一.事件: 公司BA今日在st2环境提测试单,添加产品时候一直过不去,找我帮忙看,因为关系比较熟,正好也不是非常忙,我就帮忙定位了下.首先,我在生产环境重现了下,没有问题,在dev环境重现,也没有问题 ...
- php 重复问题
结果: 结论: 尽量在方法内用变量去接受重复的参数或重复的方法/结果,消耗的时间积少成多
- GitLab CI/CD持续集成设置
GitLab CI/CD持续设置 官方文档地址(https://docs.gitlab.com/ee/ci/README.html) GitLab CI.CD功能非常完善,只需要简单几步,就可以完成项 ...
- go语言之map
go语言的map就相当于python的dict 1.map的初始化 //创建map //k的类型是int,v的类型是string var test25_1 map[int]string fmt.Pri ...