互质问题,特别注意1的处理!!!
构建了容斥和莫比乌斯函数的对应关系
详见zyf2000的博客
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
const int N=200005;
int n,q,vis[N];
vector<int> p[N];
ll f[500005];
bool b[500005];int pri[500005],num,mi[500005],u[500005];
void init()
{
u[1]=1;
for (int i=2;i<=500000;i++)
{
if (!b[i]) pri[++num]=i,mi[i]=i,u[i]=-1;
for (int j=1;j<=num&&i*pri[j]<=500000;j++)
{
b[i*pri[j]]=true;mi[i*pri[j]]=pri[j];
if (i%pri[j]==0) u[i*pri[j]]=0;else u[i*pri[j]]=-u[i];
if (i%pri[j]==0) break;
}
}
}
ll work(int x)
{
if (p[x].size()==0) return f[1]-1;
int sz=p[x].size();
int S=1<<sz,tmp;ll ans=0;
for (int i=0;i<S;i++)
{
tmp=1;
for (int j=0;j<sz;j++)
if (i&(1<<j)) tmp=tmp*p[x][j];
ans+=u[tmp]*f[tmp];
}
return ans;
}
void updata(int x)
{
int sz=p[x].size();
int S=1<<sz,tmp;ll ans=0;
for (int i=0;i<S;i++)
{
tmp=1;
for (int j=0;j<sz;j++)
if (i&(1<<j)) tmp=tmp*p[x][j];f[tmp]+= vis[x]==1 ? 1:-1;
}
}
int main()
{
scanf("%d%d",&n,&q);
init();
int x,last;
for (int i=1;i<=n;i++)
{
scanf("%d",&x);last=0;
while (x>1)
{
if (mi[x]!=last) p[i].push_back(mi[x]);
last=mi[x];
x=x/mi[x];
}
}
ll ans=0;
for (int i=1;i<=q;i++)
{
scanf("%d",&x);
ans-=vis[x]*work(x);
vis[x]=1-vis[x];
updata(x);
ans+=vis[x]*work(x);
printf("%lld\n",ans);
}
return 0;
}