给出
n
≤
2
e
5
n\leq2e5
n≤2e5个数,求出对于所有的子序列,如果子序列中所有的数的
g
c
d
≥
2
gcd\geq2
gcd≥2,那么答案加上
g
c
d
×
gcd×
gcd×序列长度。
数的范围不大,直接从大到小枚举所有的数,然后求出多少个数是此数的倍数,设此数倍数个数为
c
n
t
cnt
cnt,那么贡献为
f
[
i
]
=
∑
i
=
1
c
n
t
i
C
c
n
t
i
=
c
n
t
×
2
c
n
t
−
1
f[i]=\sum_{i=1}^{cnt}iC_{cnt}^{i}=cnt×2^{cnt-1}
f[i]=∑i=1cntiCcnti=cnt×2cnt−1,但还要减去倍数带来的贡献。
f
[
i
]
=
f
[
i
]
−
∑
i
∣
j
f
[
j
]
f[i]=f[i]-\sum_{i|j}f[j]
f[i]=f[i]−∑i∣jf[j],最终答案为
∑
i
=
1
n
i
f
[
i
]
\sum_{i=1}^{n}if[i]
∑i=1nif[i]。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=1e6+7;
const int mod=1e9+7;
int w[N],a[N];
ll f[N];
ll fpow(ll x,ll y) {
ll ans=1;
while(y) {
if(y&1) ans=(ans*x)%mod;
x=(x*x)%mod;
y>>=1;
}
return ans;
}
int main() {
int n;
int mx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
mx=max(mx,a[i]);
w[a[i]]++;
}
ll ans=0;
for(int i=mx;i>1;i--) {
int t=0;
for(int j=i;j<=mx;j+=i) t+=w[j];
if(t==0) continue;
f[i]=1LL*t*fpow(2,t-1)%mod;
for(int j=2*i;j<=mx;j+=i)
f[i]=(f[i]-f[j]+mod)%mod;
ans=(ans+f[i]*i+mod)%mod;
}
printf("%lld\n",ans);
return 0;
}