Cod sursa(job #1442473)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 25 mai 2015 16:43:14
Problema Indep Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
/*
    If you can't explain it simply, you don't understand it well enough.
*/

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int base = 1000000000;
const int Nmax = 510;
const int Vmax = 1010;

int n , i , j , crt , Max;
int a[Nmax];

vector < int > d[2][Vmax] , aux;

int cmmdc(int a , int b)
{
    int r = a % b;

    while (r)
    {
        a = b;
        b = r;
        r = a % b;
    }

    return b;
}

void suma(vector < int > &A , vector < int > B)
{
    int i , T = 0 , A0 = A.size() , B0 = B.size();

    for (i = A0; i < B0; A.push_back(0), ++i);
    for (i = B0; i < A0; B.push_back(0), ++i);

    A0 = max(A0 , B0);

    for (i = 0; i < A0; ++i)
    {
        A[i] += B[i] + T;
        T = A[i] / base;
        A[i] %= base;
    }

    if (T) A.push_back(T);
}

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

    for (scanf("%d", &n), i = 1; i <= n; ++i)
        scanf("%d", &a[i]),
        Max = max(Max , a[i]);

    aux.push_back(1);

    for (crt = 1, i = 1; i <= n; crt ^= 1, ++i)
    {
        for (j = 1; j <= Max; ++j)
            d[crt][j].clear();
        for (j = 1; j <= Max; ++j)
            suma(d[crt][j] , d[crt^1][j]),
            suma(d[crt][cmmdc(a[i] , j)] , d[crt^1][j]);

        suma(d[crt][a[i]] , aux);
    }

    aux[0] = 0; crt ^= 1;
    suma(d[crt][1] , aux);

    printf("%d", d[crt][1].back()); d[crt][1].pop_back();

    for ( ; d[crt][1].size(); d[crt][1].pop_back())
        printf("%.9d", d[crt][1].back());

    return 0;
}