Cod sursa(job #1524846)

Utilizator cristina_borzaCristina Borza cristina_borza Data 14 noiembrie 2015 14:59:04
Problema Indep Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <cstring>

#define BASE 100000

using namespace std;

ifstream f("indep.in");
ofstream g("indep.out");

int n , v[505] , dp1[1005][305] , dp2[1005][305] , aux[305] , NMAX , nrc = 5;

void adun(int a[] , int b[]);
void afis(int a[]);
int gcd(int a , int b) {
    int r = a % b;
    while(r) {
        a = b;
        b = r;
        r = a % b;
    }

    return b;
}

int main() {
    aux[0] = 1;
    aux[1] = 1;

    f >> n;

    for(int i = 1 ; i <= n ; ++i) {
        f >> v[i];
        NMAX = max(NMAX , v[i]);
    }

    for(int i = 1 ; i <= n ; ++i) {
        if(i % 2 == 1) {
            memset(dp1 , 0 , sizeof(dp1));
        }
        else {
            memset(dp2 , 0 , sizeof(dp2));
        }
        for(int j = 1 ; j <= NMAX ; ++j) {
            if(i % 2 == 0) {
                adun(dp2[gcd(j , v[i])] , dp1[j]);
                adun(dp2[j] , dp1[j]);
            }
            else {
                adun(dp1[gcd(j , v[i])] , dp2[j]);
                adun(dp1[j] , dp2[j]);
            }
        }

        if(i % 2 == 1) {
            adun(dp1[v[i]] , aux);
        }
        else {
            adun(dp2[v[i]] , aux);
        }
    }

    if(n % 2 == 1)
        afis(dp1[1]);
    else
        afis(dp2[1]);
    return 0;
}

void adun(int a[] , int b[]) {
    int t = 0 , put = 1;
    for(int i = 1 ; i <= max(a[0] , b[0]) ; ++i) {
        int aux;

        a[i] = b[i] + a[i] + t * put;
        t = a[i] / BASE;
        a[i] = a[i] % BASE;
    }

    a[0] = max(a[0] , b[0]);

    while(t) {
        a[++a[0]] = t % BASE;
        t /= BASE;
    }
}

void afis(int a[]) {

    if(a[0] == 0) {
        g << 0;
    }
    //g << a[a[0]];
    for(int i = a[0] ; i >= 1 ; --i) {
        int nr = a[i] , cnt = 0;
        while(nr) {
            nr /= 10;
            ++cnt;
        }

        if(i != a[0])
            for(int j = cnt + 1 ; j <= nrc ; ++j) {
                g << 0;
            }
        g << a[i];
    }
}