Cod sursa(job #1774722)

Utilizator mariusn01Marius Nicoli mariusn01 Data 9 octombrie 2016 13:08:48
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <iostream>

using namespace std;

int a[510], x[1010], y[1010], b[1010];
int n, i, j, maxim, k, p, nr, e, sol;
int P2[510][510], Doi[510], sump[510], summ[510];

void scadere(int A[], int B[]){
    int i, T=0;
    for (i=B[0]+1;i<=A[0];)
        B[i++]=0;
    for (i=1;i<=A[0];i++) {
        A[i]=A[i]-(B[i]+T);
        if (A[i]<0)
            T=1;
        else
            T=0;
        if (T)
            A[i]+=10;
    }
    while (!A[A[0]])
        A[0]--;
}

void adunare(int A[], int B[], int C[]) {
    int t = 0;
    int i, m = (A[0] > B[0] ? A[0] : B[0]);

    for (i=1;i<=m;i++) {
        C[i] = A[i] + B[i] + t;
        t = C[i]/10;
        C[i] = C[i] % 10;
    }
    C[0] = m;
    if (t)
        C[ ++C[0] ] = t;
}

void inmultire (int A[], int b, int C[]) {
    int t = 0, i;
    for (i=1;i<=A[0];i++) {
        C[i] = A[i]*b + t;
        t = C[i] / 10;
        C[i] %= 10;
    }
    C[0] = A[0];
    while (t) {
        C[ ++C[0] ] = t%10;
        t /= 10;
    }
}

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

    fin>>n;
    for (int i=1;i<=n; i++) {
        fin>>a[i];
        if (a[i] > maxim) {
            maxim = a[i];
        }
    }
//    doi[0] = 1; doi[1] = 2; // numarul 2
    Doi[0] = 1; Doi[1] = 2; // puterea lui 2
    P2[1][0] = 1;P2[1][1] = 1;
    sump[0] = 1; sump[1] = 0;
    summ[0] = 1; summ[1] = 0;

    for (i=2;i<=n;i++) {
        adunare(P2[i-1], Doi, P2[i]);
        inmultire (Doi, 2, Doi);
    }

    for (i=2;i<=maxim;i++) {
        j = 2;
        k = i;
        int ok = 1;
        nr = 0;
        while (k!=1) {
            e = 0;
            while (k%j == 0) {
                e++;
                k/=j;
            }
            if (e>=2) {
                ok = 0;
            }
            if (e == 1) {
                nr++;
            }
            j++;
        }
        if (ok) {
            x[++p] = i;
            y[p] = nr;
        }

    }
    /*
    for (i=1;i<=p;i++)
        cout<<x[i]<<" ";
    */
    for (i=1;i<=p;i++) {
        nr = 0;
        for (j=1;j<=n;j++)
            if (a[j]%x[i] == 0)
                nr++;
        if (y[i] % 2 == 1)
            //sol += ((1<<nr)-1);
            adunare(sump, P2[nr], sump);
        else
            //sol -= ((1<<nr)-1);
            adunare(summ, P2[nr], summ);
    }

    scadere(sump, summ);
    scadere(P2[n], sump);

//    fout<<(1<<n)-1-sol;

    for (int i=P2[n][0];i>=1;i--)
        fout<<P2[n][i];

    return 0;
}