Cod sursa(job #347519)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 12 septembrie 2009 17:08:28
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

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

#define N 505
#define M 1005
#define NRCIF 100

int n , a[N], d[2][M][NRCIF], unu[2] = {1, 1};//[M];

int gcd(int i, int j)
{
    if (!i || !j)
        return i ? i : j;

    return gcd(max(i, j) % min(i, j), min(i, j));
}

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;
}

int main()
{
    int i, j;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d", &n);

    for (i = 1; i <= n; ++ i)
        scanf("%d", &a[i]);

    for (i = 1; i < n; ++ i)
        for (j = 1; j <= 1000; ++ j)
        {
            if (j == a[i])
                add(d[i & 1][j], unu);

            add(d[(i + 1) & 1][gcd(j, a[i + 1])], d[i & 1][j]);

            add(d[(i + 1) & 1][j], d[i & 1][j]);

            memset(d[i & 1][j], 0, sizeof(d[i & 1][j]));
        }

    add(d[n & 1][a[n]], unu);

    if (d[n & 1][1][0] == 0)
        printf("0");

    for ( ; d[n & 1][1][0]; -- d[n & 1][1][0])
        printf("%d", d[n & 1][1][d[n & 1][1][0]]);

    printf("\n");
}