Cod sursa(job #670415)

Utilizator vlad2901Vlad Berindei vlad2901 Data 28 ianuarie 2012 23:55:23
Problema Indep Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define NMAX 500
#define LMAX 1000
#define BASE 1000000000
#define CMAX 50

using namespace std;

int v[NMAX];
int a[2][LMAX+1][CMAX], b[CMAX];
int N;

void print(int a[])
{
    printf("%d", a[1]);
    for(int i=2;i<=a[0];++i)
    {
        printf("%09d", a[i]);
    }
    printf("\n");
}

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

void add(int a[], int b[]) //adun pe b peste a
{
    int m = max(a[0], b[0]);
    int c = 0;

    a[0] = m;

    for(int i=1;i<=m;++i)
    {
        int aux = a[i] + b[i] + c;
        if(a[i] > BASE || b[i] > BASE)
        {
            aux++;
        }
        if(aux<0)
        {
            aux++;
        }
        a[i] = aux % BASE;
        c = aux / BASE;

    }

    if(c)
    {
        a[++a[0]] = c;
    }
}

int main()
{

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

    scanf("%d", &N);

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

    a[1][v[0]][0] = 1;
    a[1][v[0]][1] = 1;

    int l = 1;
    b[0] = 1;
    b[1] = 1;

    for(int i=1;i<N;++i, l=1-l)
    {
        for(int j=1;j<=LMAX;++j)
        {
            memset(a[1-l][j], 0, sizeof(a[1-l][j]));
            a[1-l][j][0] = 1;
        }

        for(int j=1;j<=LMAX;++j)
        {
            if(a[l][j][0] > 0)
            {
                add(a[1-l][cmmdc(j,v[i])], a[l][j]);
                add(a[1-l][j], a[l][j]);
            }
        }
        add(a[1-l][v[i]], b);
    }
    a[l][1][0] =  3;
    a[l][1][1] =  3;
    a[l][1][2] =  3;
    a[l][1][3] =  3;

    print(a[l][1]);

    return 0;
}