解法
考虑枚举gcd==g,计算每个gcd的贡献:记c[g]表示数列中为g的倍数的数有多少个,然后考虑一个g的贡献就是
(
n
−
c
[
g
]
)
∗
(
2
c
[
g
]
−
1
)
(n-c[g])*(2^{c[g]}-1)
(n−c[g])∗(2c[g]−1),前一个计算的是x,后一个计算的是{S}。
但是这样是有计算多余的,也有算重的:举个例子:当
g
=
6
g=6
g=6的时候,a数列中有2,6,那么会把
S
=
{
6
}
,
x
=
2
S = \left\{6\right\} ,x=2
S={6},x=2计算进答案,考虑什么容斥系数可以去掉实际gcd不等于1的贡献呢?看起来和莫比乌斯函数有关:考虑一个合法的
S
,
将
它
的
g
c
d
设
为
q
S,将它的gcd设为q
S,将它的gcd设为q,它会在所有
g
∣
q
g|q
g∣q时被算上,由于合法的
S
S
S的要求是
[
q
!
=
1
]
[q!=1]
[q!=1],所以可以得知每个g的容斥系数是-mu[g]
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int maxn=5e5+5;
const int maxm=1e7+5;
inline int read(){
char c=getchar();int t=0,f=1;
while((!isdigit(c))&&(c!=EOF)){if(c=='-')f=-1;c=getchar();}
while((isdigit(c))&&(c!=EOF)){t=(t<<3)+(t<<1)+(c^48);c=getchar();}
return t*f;
}
int n,a[maxn],mx;
int mu[maxm],p[maxm],vis[maxm],cnt;
void get(){
mu[1]=1;
for(int i=2;i<=mx;i++){
if(!vis[i]){p[++cnt]=i;mu[i]=-1;}
for(int j=1;j<=cnt&&i*p[j]<=mx;j++){
vis[i*p[j]]=1;mu[i*p[j]]=-mu[i];
if(i%p[j]==0){
mu[i*p[j]]=0;
break;
}
}
}
}
int c[maxm];
int pre[maxm];
signed main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
c[a[i]]++;
mx=max(mx,a[i]);
}
pre[0]=1;
for(int i=1;i<=mx;i++)pre[i]=2ll*pre[i-1]%mod;
get();
int ans=0;
for(int i=1;i<=mx;i++){int tmp=0;
for(int j=i;j<=mx;j+=i)tmp+=c[j];
ans=((ans+1ll*(-mu[i])*(n-tmp)%mod*(pre[tmp]-1)%mod)%mod+mod)%mod;
}
printf("%d\n",(ans+mod)%mod);
return 0;
}