Cod sursa(job #1295189)

Utilizator RaduVisanRadu Visan RaduVisan Data 18 decembrie 2014 22:19:52
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
using namespace std;

const int NMAX = 510, ValMAX = 1010, DMAX = 200;

int N, V[NMAX], Dp[2][ValMAX][DMAX], Current, Next, One[DMAX];

void Add(int A[DMAX], int B[DMAX])
{
    int i, T = 0;
    for(i = 1; i <= A[0] || i <= B[0] || T; i ++, T /= 10)
    {
        T += A[i] + B[i];
        A[i] = T % 10;
    }
    A[0] = i - 1;
}

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

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]);

    Dp[0][0][0] = Dp[0][0][1] = 1;
    One[0] = One[1] = 1;

    Current = 0; Next = 1;

    for(int i = 0; i < N; ++ i)
    {
        for(int j = 0; j < ValMAX; ++ j)
        {
            Add(Dp[Next][j], Dp[Current][j]);
            Add(Dp[Next][ GCD(j, V[i + 1]) ], Dp[Current][j]);
            Dp[Current][j][0] = 1;
            for(int k = 1; k < DMAX; ++ k)
                Dp[Current][j][k] = 0;
        }

        Current ^= 1;
        Next ^= 1;
    }

    for(int i = Dp[Current][1][0]; i >= 1; -- i)
        printf("%i", Dp[Current][1][i]);
}