Cod sursa(job #1198598)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 16 iunie 2014 12:46:33
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <fstream>
#include <algorithm>
#include <cstring>

#define NMAX 505
#define VALMAX 1005
#define cifre 60
#define base 1000
using namespace std;

ofstream cout("indep.out");

class nr_mare
{
public:
    int v[cifre];

    nr_mare(int c=0)
    {
        memset(v,0,sizeof(v));

        v[0]=1;
        v[1]=c;
    }

    nr_mare operator+(nr_mare b)
    {
        nr_mare c;
        c.v[0]=max(v[0],b.v[0]);

        int i,tr=0;
        for(i=1;i<=c.v[0];i++){
            c.v[i]=v[i]+b.v[i]+tr;
            tr=c.v[i]/base;
            c.v[i]%=base;
        }

        while(tr){
            c.v[++c.v[0]]=tr;
            tr=c.v[c.v[0]]/base;
            c.v[c.v[0]]%=base;
        }

        return c;
    }

    nr_mare operator-(nr_mare b)
    {
        nr_mare c;
        c.v[0]=v[0];

        int i,tr=0;
        for(i=1;i<=c.v[0];i++){
            c.v[i]=v[i]-b.v[i]-tr;

            tr=0;
            if(c.v[i]<0){
                tr=1;
                c.v[i]+=base;
            }
        }

        while(c.v[0]>1 && !c.v[c.v[0]])
            c.v[0]--;

        return c;
    }

    nr_mare operator*(const int &b)
    {
        nr_mare c;
        c.v[0]=v[0];

        int i,tr=0;
        for(i=1;i<=c.v[0];i++){
            c.v[i]=v[i]*b+tr;
            tr=c.v[i]/base;
            c.v[i]%=base;
        }

        while(tr){
            c.v[++c.v[0]]=tr;
            tr=c.v[c.v[0]]/base;
            c.v[c.v[0]]%=base;
        }

        return c;
    }
};

ostream& operator<<(ostream &g,const nr_mare &x)
{
    for(int i=x.v[0];i>=1;i--)
    {
        if(i!=x.v[0])
        {
            if(!(x.v[i]/10)) //Baza 100
                cout<<'0';
            if(!(x.v[i]/100)) //Baza 1000
                cout<<'0';
            //if(!(x.v[i]/1000)) //Baza 10000
            //    cout<<'0';
        }

        cout<<x.v[i];
    }

    return g;
}

nr_mare put2[NMAX];
inline void precalc(int &n)
{
    for(int i=1;i<=n;i++)
        put2[i]=((put2[i-1]*2)+nr_mare(1));
}

int v[NMAX];

int cate[VALMAX];
inline void proc_nr(int &n)
{
    for(int i=1;i<VALMAX;i++)
        for(int j=1;j<=n;j++)
            if(v[j]%i==0)
                cate[i]++;
}

nr_mare din[VALMAX];
inline void calc_ans(int &n)
{
    for(int i=VALMAX-1;i>=1;i--){
        din[i]=put2[cate[i]];
        for(int j=2;(i*j)<VALMAX;j++)
            din[i]=din[i]-din[i*j];
    }
}

int main()
{
    ifstream cin("indep.in");

    int n=0;
    cin>>n;

    for(int i=1;i<=n;i++)
        cin>>v[i];

    proc_nr(n);
    precalc(n);
    calc_ans(n);

    cout<<din[1]<<'\n';

    cin.close();
    cout.close();
    return 0;
}