Cod sursa(job #2521293)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 10 ianuarie 2020 18:37:56
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>

using namespace std;
int a[510],x[1010],y[1010];
int p2[510][510],doi[510],sump[510],sumi[510];
int i,j,n,Max,nr,e,k,d,ok,p;

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]]==0) a[0]--;
}

void adunare (int a[],int b[],int c[]) {
    int t=0,i;
    for (i=1;i<=max(a[0],b[0]);i++) {
        t+=a[i]+b[i];
        c[i]=t%10;
        t/=10;
    }
    c[0]=max(a[0],b[0]);
    while (t) {
        c[++c[0]]=t%10;
        t/=10;
    }
}

void inmultire (int a[],int b,int c[]) {
    int t=0,i;
    for (i=1;i<=a[0];i++) {
        t+=a[i]*b;
        c[i]=t%10;
        t/=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 (i=1;i<=n;i++) {
        fin>>a[i];
        Max=max(Max,a[i]);
    }
    doi[0]=1;doi[1]=2;
    p2[1][0]=1;p2[1][1]=1;
    sump[0]=1;sump[1]=0;
    sumi[0]=1;sumi[1]=0;
    for (i=2;i<=n;i++) {
        adunare(p2[i-1],doi,p2[i]);
        inmultire(doi,2,doi);
    }
    for (i=2;i<=Max;i++) {
        k=i;
        d=2;
        ok=1;
        nr=0;
        while (k>1) {
            e=0;
            while (k%d==0) {
                k/=d;
                e++;
            }
            if (e>=2) {
                ok=0;
            }
            if (e==1) nr++;
            d++;
        }
        if (ok==1) {
            x[++p]=i;
            y[p]=nr;
        }
    }
    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) adunare(sump,p2[nr],sump);
        else adunare(sumi,p2[nr],sumi);
    }
    scadere(sump,sumi);
    scadere(p2[n],sump);
    if (p2[n][0]<=0) fout<<0;
    else {
        for (i=p2[n][0];i>=1;i--) fout<<p2[n][i];
    }
    return 0;
}