# 【HDU4947】GCD Array（莫比乌斯反演+树状数组）

### 对于修改操作的推式子

$a_i+=v\cdot[gcd(i,k)=d]$

$[gcd(i\cdot d,k)=d]$转化，即三个数同时除以$d$，得到：

$a_i+=v\cdot[gcd(\frac id,\frac kd)=1]$

$a_i+=\sum_{p|\frac id,p|\frac kd}v\cdot\mu(p)$

$a_i+=\sum_{(p\cdot d)|i,p|\frac kd}v\cdot \mu(p)$

$f_{p\cdot d}+=v\cdot\mu(p)$

$a_i=\sum_{j|i}f_j$

### 对于询问操作的推式子

$a_i=\sum_{j|i}f_j$

$\sum_{i=1}^x\sum_{j|i}f_j$

$\sum_{j=1}^x\lfloor\frac xj\rfloor f_j$

### 代码

#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 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可忽略
{
{
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;
}
posted @ 2019-11-10 15:30  TheLostWeak  阅读(...)  评论(... 编辑 收藏