Cod sursa(job #129380)

Utilizator damaDamaschin Mihai dama Data 29 ianuarie 2008 11:03:31
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#include <string.h>

int c[2][1024][200], n, v[1024];

void add(int*, int*);
void add(int*);

int cmmdc(int a, int b)
{
    if(a % b == 0)
        return b;
    return cmmdc(b, a % b);
}

int main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);

    int i, j, crt = 0, temp, k;

    scanf("%d", &n);
    if(n == 1)
    {
        printf("1\n");
        return 0;
    }

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

    for(i = 1; i <= n; ++i)
    {
        for(j = 1; j <= 1000; ++j)
            memcpy(c[crt][j], c[1 - crt][j], sizeof(c[crt][j]));
        for(j = 1; j <= 1000; ++j)
        {
            temp = cmmdc(v[i], j);
            add(c[crt][temp], c[1 - crt][j]);
        }
        add(c[crt][v[i]]);
        /*
        for(j = 1; j <= 6; ++j)
        {
            printf("%d %d: ", i, j);
            for(k = c[crt][j][0]; k > 0; --k)
            {
                printf("%d", c[crt][j][k]);
            }
            printf("\n");
        }
        */
        crt = 1 - crt;
    }

  //  printf("%d\n",c[1 - crt][1][0]);

    printf("%d", c[1 - crt][1][c[1 - crt][1][0]]);
    for(i = c[1 - crt][1][0] - 1; i > 0; --i)
    {
        printf("%08d", c[1 - crt][1][i]);
    }

    return 0;
}

void add(int* a)
{
    ++a[1];
    int i = 1;
    while(a[i] == 100000000)
    {
        a[i]= 0;
        ++a[i + 1];
        ++i;
    }
    if(a[0] < i - 1)
        a[0] = i - 1;
    if(a[0] == 0)
        a[0] = 1;
}

void add(int* a, int* b)
{
    int i, t;
    for(i = 1, t = 0; i <= a[0] || i <= b[0] || t; ++i, t /= 100000000)
    {
        a[i] = (t += a[i] + b[i]) % 100000000;
    }
    if(a[0] < i - 1)
        a[0] = i - 1;
}