Cod sursa(job #1771406)

Utilizator borcanirobertBorcani Robert borcanirobert Data 5 octombrie 2016 16:49:48
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;

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

const int MAXN = 510;
const int MAXNR = 1005;
const int MAXCIF = 10000;
using NrMare = int[MAXCIF];
int N;
int a[MAXN];
NrMare D[MAXNR];
int maxim;
NrMare unu;

void Read();
void Solve();
int Cmmdc( int a, int b );
void Add( NrMare a, NrMare b );
void Write();

int main()
{
    Read();
    Solve();
    Write();

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    int i;

    fin >> N;
    for ( i = 1; i <= N; i++ )
    {
        fin >> a[i];
        maxim = max(maxim, a[i]);
    }
}

void Solve()
{
    int i, j;

    unu[0] = unu[1] = 1;
    for ( i = 1; i <= N; i++ )
    {
        for ( j = 1; j <= maxim; j++ )
            if ( D[j] > 0 )
                Add(D[Cmmdc(j, a[i])], D[j]);

        Add(D[a[i]], unu);
    }
}

int Cmmdc( int a, int b )
{
    int rest;

    do
    {
        rest = a % b;
        a = b;
        b = rest;
    } while ( rest != 0 );

    return a;
}

void Add( NrMare a, NrMare b )
{
    int cif, t = 0, i;

    for ( i = 1; i <= max(a[0], b[0]); i++ )
    {
        cif = t + a[i] + b[i];
        a[i] = cif % 10;
        t = cif / 10;
    }

    a[0] = max( a[0], b[0] );
    while ( t )
        a[++a[0]] = t % 10, t /= 10;
}

void Write()
{
    int i;

    for ( i = D[1][0]; i >= 1; i-- )
        fout << D[1][i];
    fout << '\n';
}