Cod sursa(job #997997)

Utilizator poptibiPop Tiberiu poptibi Data 15 septembrie 2013 14:03:25
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

const int NMAX = 1005, BASE = 1000000000;

int N, V[NMAX], DP[NMAX][110], AUX[110];

int GCD(int A, int B)
{
    if(!B) return A;
    return GCD(B, A % B);
}

void Add(int A[110], int B[110])
{
    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 main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);

    scanf("%i", &N);
    for(int i = 1; i <= N; ++ i) scanf("%i", &V[i]);

    AUX[0] = AUX[1] = 1;

    for(int i = 1; i <= N; ++ i)
    {
        for(int j = 1; j <= 1000; ++ j)
            Add(DP[GCD(j, V[i])], DP[j]);
        Add(DP[V[i]], AUX);
    }

    if(DP[1][0] == 0) printf("0\n");
    else
    {
        printf("%d", DP[1][DP[1][0]]);
        for(int i = DP[1][0] - 1; i; -- i)
            printf("%09d", DP[1][i]);
        printf("\n");
    }

    return 0;
}