题目

【莫比乌斯反演】互质数对_题组
【莫比乌斯反演】互质数对_题组_02

思路

【莫比乌斯反演】互质数对_题组_03

代码

#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;
}