Cod sursa(job #3288468)

Utilizator mariusharabariMarius Harabari mariusharabari Data 22 martie 2025 14:53:53
Problema Indep Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("indep.in");
ofstream fout("indep.out");

const int MOD = 1e9 + 7, MAXA = 1001;

int main() {
    int n;
    fin >> n;
    vector<int> v(n);
    for (int i = 0; i < n; i++)
        fin >> v[i];

    vector<int> cmmdp(MAXA);
    iota(cmmdp.begin(), cmmdp.end(), 0);
    for (int i = 2; i * i < MAXA; i++) {
        if (cmmdp[i] == i) {
            for (int j = i * i; j < MAXA; j += i) {
                if (cmmdp[j] == j) {
                    cmmdp[j] = i;
                }
            }
        }
    }

    vector<int> mu(MAXA);
    mu[1] = 1;
    for (int d = 2; d < MAXA; d++) {
        int x = d, div = 0;
        bool sq = false;
        while (x != 1) {
            int p = cmmdp[x], cnt = 0;
            while (x % p == 0) {
                x /= p;
                cnt++;
            }
            if (cnt > 1) {
                sq = true;
                break;
            }
            div++;
        }
        if (sq)
            mu[d] = 0;
        else
            mu[d] = (div % 2 == 0) ? 1 : -1;
    }

    vector<int> counter(MAXA, 0);
    for (int d = 1; d < MAXA; d++) {
        for (int num : v) {
            if (num % d == 0) {
                counter[d]++;
            }
        }
    }

    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 rez = 0;
    for (int d = 1; d < MAXA; d++) {
        if (mu[d] == 0 || counter[d] == 0)
            continue;
        long long a = (pow2[counter[d]] - 1) % MOD;
        a = (a * mu[d]) % MOD;
        rez = (rez + a + MOD) % MOD;
    }

    fout << rez;
    return 0;
}