Cod sursa(job #3288537)

Utilizator mariusharabariMarius Harabari mariusharabari Data 22 martie 2025 16:42:06
Problema Indep Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#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;
}