Cod sursa(job #774495)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 5 august 2012 12:20:17
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>

using namespace std;

typedef long long int64;

const int N = 505;
const int NR = 1000;
const int NRC = 1000;
const int base = 1000000000;

int n, l;
int v[N], unu[NRC] = {1, 1};
int d[2][NR + 1][NRC];

void aduna(int a[], int b[])
{
    int i, t = 0;

    for (i = 1; i <= a[0] || i <= b[0] || t; ++i, t /= base)
        a[i] = (t += a[i] + b[i]) % base;
    a[0] = i - 1;
}

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

void afiseaza(int a[])
{
    printf("%d", a[a[0]]);
    for (int i = a[0] - 1; i >= 1; --i)
        printf("%.9d", a[i]);
}

void zero(int a[][NRC])
{
    for (int i = 1; i <= NR; ++i) {
        for (int j = 1; j <= a[i][0]; ++j)
            a[i][j] = 0;
        a[i][0] = 0;
    }

}

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

    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    
    for (int i = 0; i < n; ++i) {
        l = 1 - l;
        aduna(d[1 - l][v[i + 1]], unu);
        for (int j = 1; j <= NR; ++j) {
            aduna(d[1 - l][j], d[l][j]);
            aduna(d[1 - l][cmmdc(v[i + 1], j)], d[l][j]);
        }
        zero(d[l]);
    }

    afiseaza(d[1 - l][1]);

    return 0;
}