Cod sursa(job #997994)

Utilizator poptibiPop Tiberiu poptibi Data 15 septembrie 2013 13:54:53
Problema Indep Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

const int NMAX = 1005, BASE = 10000;

int N, V[NMAX];

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

class Huge
{
    public: int D[2010];
    Huge()
    {
        memset(D, 0, sizeof(D));
    }
    Huge(int X)
    {
        *this = X;
    }
    Huge operator= (int X)
    {
        memset(D, 0, sizeof(D));
        while(X) D[++D[0]] = X % BASE, X /= BASE;
        return *this;
    }
    Huge operator= (Huge X)
    {
        memcpy(D, X.D, sizeof(X.D));
        return *this;
    }
    Huge operator+ (Huge X) const
    {
        int i, T = 0;
        Huge Now;
        for(i = 1; i <= D[0] || i <= X.D[0] || T; i ++, T /= BASE)
            Now.D[i] = (T += X.D[i] + D[i]) % BASE;
        Now.D[0] = i - 1;
        return Now;
    }
    void Print()
    {
        printf("%d", D[D[0]]);
        for(int i = D[0] - 1; i; -- i) printf("%04d", D[i]);
        printf("\n");
    }
};

Huge DP[NMAX];

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

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

    DP[1].Print();

    return 0;
}