Cod sursa(job #2515520)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 28 decembrie 2019 19:19:36
Problema Indep Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <iostream>
#define dim 501
using namespace std;

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

int n,M,i,j,k,d,e,x,v[dim],p2[dim][2*dim],fact[2*dim],cnt[2*dim],m,nr;
bool ok;
int par[2*dim],impar[2*dim];

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

void scad(int a[], int b[]){
    for(int i=b[0]+1;i<=a[0];i++)
        b[i]=0;

    int t=0;
    for(int i=1;i<=a[0];i++){
        a[i]-=b[i]+t;
        if(a[i]<0){
            t=1;
            a[i]+=10;
        }else
            t=0;
    }

    while(a[a[0]]==0)
        a[0]--;
}

void af(int v[]){
    for(int i=v[0];i;i--)
        cout<<v[i];
    cout<<"\n";
}

int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        M=max(M,v[i]);
    }

    p2[0][0]=p2[0][1]=1;
    for(i=1;i<=n;i++){
        ad(p2[i-1],p2[i-1],p2[i]);
        p2[i-1][1]--;
    }
    p2[n][1]--;

//    for(i=0;i<=11;i++)
//        af(p2[i]);

    for(i=2;i<=M;i++){
        x=i;
        ok=1;
        nr=0;
        for(d=2;x!=1;d++){
            if(x%d!=0)
                continue;

            e=0;
            while(x%d==0){
                x/=d;
                e++;
            }

            if(e>1){
                ok=0;
                break;
            }

            nr++;
        }

        if(ok){
            m++;
            fact[m]=i;
            cnt[m]=nr;
        }
    }

//    for(i=1;i<=m;i++)
//        cout<<fact[i]<<" "<<cnt[i]<<"\n";

    par[0]=impar[0]=1;
    for(i=1;i<=m;i++){
        nr=0;
        for(j=1;j<=n;j++)
            if(v[j]%fact[i]==0)
                nr++;

        if(cnt[i]%2)
            ad(impar,p2[nr],impar);
        else
            ad(par,p2[nr],par);
    }

    scad(impar,par);
    scad(p2[n],impar);

    if(p2[n][0]<=0)
        fout<<0;
    else{
        while(p2[n][0])
            fout<<p2[n][p2[n][0]--];
    }

    return 0;
}