Pagini recente » Cod sursa (job #2642452) | Cod sursa (job #371241) | Cod sursa (job #3207742) | Cod sursa (job #3277378) | Cod sursa (job #3288537)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
const int MOD = 1e9 + 7;
const int MAXA = 1000;
int main() {
int n;
fin >> n;
vector<int> v(n);
vector<int> freq(MAXA + 1, 0);
for (int i = 0; i < n; ++i) {
fin >> v[i];
freq[v[i]]++;
}
vector<int> spf(MAXA + 1);
iota(spf.begin(), spf.end(), 0);
for (int i = 2; i * i <= MAXA; ++i) {
if (spf[i] == i) {
for (int j = i * i; j <= MAXA; j += i) {
if (spf[j] == j) {
spf[j] = i;
}
}
}
}
vector<int> mu(MAXA + 1);
mu[1] = 1;
for (int d = 2; d <= MAXA; ++d) {
int x = d;
bool has_square = false;
int prime_count = 0;
int last_p = -1;
while (x != 1) {
int p = spf[x];
if (p == last_p) {
has_square = true;
break;
}
int cnt = 0;
while (x % p == 0) {
cnt++;
x /= p;
}
if (cnt > 1) {
has_square = true;
break;
}
last_p = p;
prime_count++;
}
mu[d] = has_square ? 0 : (prime_count % 2 == 0 ? 1 : -1);
}
vector<int> cnt(MAXA + 1, 0);
for (int d = 1; d <= MAXA; ++d) {
for (int multiple = d; multiple <= MAXA; multiple += d) {
cnt[d] += freq[multiple];
}
}
vector<long long> pow2(n + 1);
pow2[0] = 1;
for (int i = 1; i <= n; ++i) {
pow2[i] = (pow2[i - 1] * 2) % MOD;
}
long long ans = 0;
for (int d = 1; d <= MAXA; ++d) {
if (mu[d] == 0 || cnt[d] == 0) continue;
long long f = (pow2[cnt[d]] - 1 + MOD) % MOD;
ans = (ans + mu[d] * f) % MOD;
}
ans = (ans % MOD + MOD) % MOD;
fout << ans << endl;
return 0;
}