Cod sursa(job #47291)

Utilizator vlad_popaVlad Popa vlad_popa Data 3 aprilie 2007 15:31:59
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <cassert>
#include <string>

#define FIN "indep.in"
#define FOUT "indep.out"
#define NMAX 501

int s1[2*NMAX][50], s2[2*NMAX][50], N, v[NMAX], max, unu[50];

void read ()
{
    scanf ("%d", &N);

    for (int i = 1; i <= N; ++ i)
    {
        scanf ("%d", &v[i]);
        if (v[i] > max)
            max = v[i];
    }
}

int cmmdc (int a, int b)
{
    int r;
    do
    {
        r = a % b;
        a = b;
        b = r;
    }
    while (r != 0);
    
    return a;
}

void add (int A[], int B[])
{
    int i, t = 0;

    for (i = 1; i <= A[0] || i <= B[0] || t; ++ i, t /= 10)
        A[i] = (t += A[i] + B[i]) % 10;

    A[0] = i - 1;
}

void solve ()
{
    int c;
    unu[0] = unu[1] = 1;

    for (int i = 1; i <= N; ++ i)
    {
        for (int j = 1; j <= max; ++ j)
        {
            c = cmmdc (j, v[i]);
            if (c != j)
            {
               add (s2[c], s1[j]);
               add (s2[c], s1[c]);
            }
            else
                add (s2[c], s1[j]);
        }

        add (s2[v[i]], unu);
        
        memcpy (s1, s2, sizeof (s2));
        memset (s2, 0, sizeof (s2));
    }

    for (int i = s1[1][0]; i >= 1; -- i)
        printf ("%d", s1[1][i]);
    printf ("\n");
}

int
 main ()
{
    freopen (FIN, "rt", stdin);
    freopen (FOUT, "wt", stdout);

    read ();
    solve ();

    return 0;
}