Cod sursa(job #3152793)

Utilizator db_123Balaban David db_123 Data 26 septembrie 2023 20:00:07
Problema Indep Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

ifstream cin("indep.in");
ofstream cout("indep.out");

#define int long long
const int DIM = 1e3;

int n;
vector<int> v,primes;
bool* sieve;
vector<int> mb(DIM+1,1);

void read() {
    cin>>n;
    v.resize(n+1);
    for(int i=1;i<=n;i++) {
        cin>>v[i];
    }
}

void constructPrimes() {
    sieve = new bool[DIM+1];
    sieve[1]=1;
    for(int i=2;i*i<=n;i++) {
        if(sieve[i]) {
            continue;
        }
        primes.push_back(i);
        for(int j=i*i;j<=DIM;j+=i) {
            sieve[j]=1;
        }
    }
}

void build_mb() {
    int sq = sqrt(DIM);
    for(int i=1;i<=DIM;i++) {
        if(sieve[i]) {
            continue;
        }
        for(int j=i;j<=DIM;j+=i) {
            mb[j]*=-1;
        }
        if(i>=sq) {
            continue;
        }
        for(int j=i*i;j<=DIM;j+=i*i) {
            mb[j]=0;
        }
    }
}

void solve() {
    constructPrimes();

    vector<int> fr_mult(1e3+1);
    for(int x=1;x<=1e3;x++) {
        for(int i=1;i<=n;i++) {
            if(v[i]%x==0) {
                fr_mult[x]++;
            }
        }
    }

    build_mb();

    int rs=0;
    for(int x=1;x<=1e3;x++) {
        rs+=mb[x] * ((1<<fr_mult[x])-1);
    }
    cout<<rs;
}

int32_t main() {

    read();
    solve();
    return 0;
}