【莫比乌斯反演】互质数对
原创
©著作权归作者所有:来自51CTO博客作者bruteforce_的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目
思路
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+77;
int n,m,a[N],u[N*3],sum[N*3];
bool hs[N*3],bj[N];
vector<int>vec[N*3];
long long ans=0;
void Solve(int n)
{
u[1]=1;
for(int i=1; i<=n; i++)
{
if(hs[i])vec[i].push_back(i);
for(int j=2*i; j<=n; j+=i)
{
u[j]-=u[i];
if(hs[j])vec[j].push_back(i);
}
}
}
void add(int x)
{
for(auto& i:vec[x])
{
ans+=u[i]*sum[i];
sum[i]++;
}
}
void del(int x)
{
for(auto& i:vec[x])
{
sum[i]--;
ans-=u[i]*sum[i];
}
}
int main()
{
freopen("pair.in","r",stdin); freopen("pair.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]),hs[a[i]]=1;
Solve(500000);
for(int i=1; i<=m; i++)
{
int x;
scanf("%d",&x);
if(!bj[x]) add(a[x]);
else del(a[x]);
bj[x]^=1;
printf("%lld\n",ans);
}
return 0;
}