Cod sursa(job #1631639)

Utilizator lflorin29Florin Laiu lflorin29 Data 5 martie 2016 17:39:03
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

const int base = 1e7;

void Init(vector<int>&a, int x)
{
    a.clear();
    for(; x ; x /= base)
        a.push_back(x % base);
}

void adauga(vector<int> &a, vector<int> b) {
    a.resize(max(a.size(), b.size()));
    b.resize(max(a.size(), b.size()));
    int t = 0;
    for(int i = 0; i < (int)a.size(); ++i)
    {
        a[i] += b[i] + t;
        t = a[i] / base;
        a[i] %= base;
    }

    if(t) a.push_back(t);
}

void inmultire(vector<int>&a, int x)
{
    int t = 0;
    for(auto &val : a)
    {
        val = val * x + t;
        t = val / base;
        val %= base;
    }

    for(; t; t /= base)
        a.push_back(t % base);
}

void afis(const vector<int>& a)
{
    if(a.size() == false) {
        printf("%d\n", 0);
        return;
    }


    printf("%d", a[a.size() - 1]);

    for(int i = a.size() - 2 ; i >= 0 ; --i)
        printf("%07d", a[i]);
    printf("\n");
}

inline int compgcd(int a , int b)
{
    if(b == 0)
        return a ;
    return compgcd(b , a % b);
}

const int MAX_NUM = 1002;

int N;
vector<int>A;
int gcd[MAX_NUM][MAX_NUM];

void Read()
{
    freopen("indep.in", "r", stdin);
    scanf("%d", &N);
    A = vector<int>(N);
    for(int i = 0; i < N; ++i)
        scanf("%d", &A[i]);
    for(int i = 1; i <= 1000; ++i)
        for(int j = i ; j <= 1000 ; ++j)
            gcd[i][j] = gcd[j][i] = compgcd(i , j);
}

vector<int>dp[2][1007];

void Solve()
{
    adauga(dp[0][A[0]], vector<int>(1, 1));
    bool crt = 1;
    for(int i = 1; i < N; ++i, crt ^= 1)
    {
     for(int T = 1; T <= 1000; ++T)
        dp[crt][T] = dp[crt ^ 1][T];

        for(int j = 1; j <= 1000; ++j)
        {
            adauga(dp[crt][gcd[j][A[i]]] , dp[crt ^ 1][j]);
        }

        adauga(dp[crt][A[i]], vector<int>(1, 1));
    }

    freopen("indep.out", "w", stdout);

    afis(dp[crt ^ 1][1]);
}
int main()
{
    Read();
    Solve();
}