Cod sursa(job #240188)

Utilizator mika17Mihai Alex Ionescu mika17 Data 6 ianuarie 2009 22:54:47
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
using namespace std;

const int NMAX = 500, VMAX = 1000, LGBIG = 50, BASE = 1000000, LG10BASE = 6;
ifstream fin("indep.in");
ofstream fout("indep.out");

int cmmdc(int a,int b)
{
        int r;
        while(b)
        {
                r = a % b;
                a = b;
                b = r;
        }

        return a;
}

void attrib_big(int * D,int * S)
{
        for(int i = 0; i <= S[0]; ++i)
                D[i] = S[i];
}

void init_big(int * &A)
{
        A = (int*) malloc(LGBIG * sizeof(int ) );
        A[0] = 1; A[1] = 0;
}

int nrcif(int x)
{
        for(int t = 10,i = 1; t < BASE; t *= 10,i++)
                if(x < t) return i;
        return LG10BASE;
}

void print_big(int * A)
{
        fout<<A[A[0]];
        for(int i = A[0] - 1; i; --i)
        {
                for(int j = nrcif(A[i]) + 1 ; j <= LG10BASE ; ++j)
                 fout<<0;
                fout<<A[i];
        }
}

inline int is_zero_big(int * A)
{
        return A[0] == 1 && !A[1] ? 1 : 0;
}

void inc_big(int * D,int x)
{
        int i,t = x;
        for(i = 1; i <= D[0] || t; ++i, t/= BASE)
         D[i] = ( t += D[i]) % BASE;

        D[0] = i - 1;
}

void add_big(int * D,int *S)   //D += S
{
        int i,t = 0;
        for(i = 1; i <= D[0] || i <= S[0] || t; ++i, t/= BASE)
         D[i] = (t += S[i] + D[i]) % BASE;

        D[0] = i - 1;
}

int *A[VMAX], *B[VMAX];

int main()
{
        int N,max = 0,sir[NMAX];


        fin>>N;
        for(int i = 0 ; i < N; ++i)
        {
                fin>>sir[i];
                max = sir[i] > max ? sir[i] : max;
        }

        for(int i = 1; i <= VMAX; ++i)
         init_big(A[i]), init_big(B[i]);

        inc_big(A[ sir[0] ], 1);

        for(int i = 1; i < N ; ++i)
        {
                for(int j = 1; j <= max; ++j)
                 attrib_big(B[j],A[j]);

                inc_big(B[ sir[i] ], 1);  //for(int i = 1; i <= max; ++i) print_big(A[i]); fout<<endl;

                for(int j = 1; j <= max; ++j)
                       if( !is_zero_big( A[j] ) )
                        add_big(B[cmmdc(j,sir[i])],A[j]);

                for(int j = 1; j <= max; ++j)
                 attrib_big(A[j],B[j]);
\
        }

        //for(int i = 1; i <= max; ++i) print_big(A[i]); fout<<endl;

        print_big(A[1]);

        return 0;
}