Cod sursa(job #47306)

Utilizator vlad_popaVlad Popa vlad_popa Data 3 aprilie 2007 15:46:57
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <cassert>
#include <string>

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

long long s1[2*NMAX], s2[2*NMAX];
int 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 || v[i] == c)
                s2[c] += s1[j] + s1[c];
            else
                s2[c] += s1[j];
        }

        ++ s2[v[i]];
        
        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");*/
    printf ("%lld\n", s1[1]);
}

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

    read ();
    solve ();

    return 0;
}