Cod sursa(job #3363926)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 25 august 2026 12:20:27
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
typedef int Huge[203];
const int DIM = 1000;
Huge p2[503], unu;
Huge rez_plus, rez_minus;
int n, frqVal[DIM + 3];
int ciur1[DIM + 3]; ///ciur1[x] = nr de factori primi dif ai lu x
bool ciur2[DIM + 3]; ///ciur2[x] = daca are vreun factor prim la o put >= 2
int frq[DIM + 3]; ///frq[x] = nr de v[i] uri div cu x

inline void atrib(Huge &x, Huge &y) {
    //x = y
    for(int i=y[0]+1; i<=x[0]; i++) x[i] = 0;
    for(int i=0; i<=y[0]; i++) x[i] = y[i];
}

inline void adunare(Huge &x, Huge &y) {
    //x += y
    if(x[0] < y[0]) x[0] = y[0];
    int t = 0;
    for(int i=1; i<=x[0]; i++, t/=10) {
        t += x[i] + y[i];
        x[i] = t % 10;
    }
    if(t) x[++x[0]] = t;
}

inline void scadere(Huge &x, Huge &y) {
    //x -= y
    for(int i=1; i<=x[0]; i++) {
        if(x[i] >= y[i]) x[i] -= y[i];
        else {
            int j = i + 1;
            while(x[j] == 0) x[j++] = 9;
            x[j]--;
            x[i] = 10 + x[i] - y[i];
        }
    }
    while(x[x[0]] == 0 && x[0] > 0) x[0]--;
}

inline void produsMIC(Huge &x, int n) {
    int t = 0;
    for(int i=1; i<=x[0]; i++, t/=10) {
        t += x[i] * n;
        x[i] = t % 10;
    }
    while(t) x[++x[0]] = t % 10, t /= 10;
}

inline void prelucru() {
    p2[0][++p2[0][0]] = 1; ///2^0 = 1
    unu[++unu[0]] = 1;
    for(int i=1; i<=500; i++) {
        atrib(p2[i], p2[i - 1]);
        produsMIC(p2[i], 2);
    }

    for(int i=2; i<=DIM; i++) {
        if(ciur1[i] == 0) { //prim
            for(int j=i; j<=DIM; j+=i) ciur1[j]++;
            for(int j=i*i; j<=DIM; j+=i*i) ciur2[j] = 1;
        }
    }

    for(int i=2; i<=DIM; i++) {
        if(ciur2[i] == 0) {
            for(int j=i; j<=DIM; j+=i) frq[i] += frqVal[j];
        }
    }
}

int main()
{
    fin >> n;
    for(int i=1; i<=n; i++) {
        int x; fin >> x;
        frqVal[x]++;
    }
    prelucru();

    atrib(rez_plus, p2[n]);
    scadere(rez_plus, unu);
    for(int i=2; i<=DIM; i++) {
        if(ciur2[i] == 0) {
            if(ciur1[i] % 2 == 1) {
                ///-(2^frq - 1) = -2^frq + 1
                adunare(rez_minus, p2[frq[i]]);
                adunare(rez_plus, unu);
            }
            else {
                ///+(2^frq - 1)
                adunare(rez_plus, p2[frq[i]]);
                adunare(rez_minus, unu);
            }
        }
    }
    scadere(rez_plus, rez_minus);
    if(rez_plus[0] == 0) fout << 0;
    else for(int i=rez_plus[0]; i>=1; i--) fout << rez_plus[i];

    return 0;
}