Cod sursa(job #2764721)

Utilizator DragosC1Dragos DragosC1 Data 22 iulie 2021 13:05:05
Problema Indep Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <iostream>
using namespace std;

int baza = 10;

typedef int bigNr[151];
int a[501], n;

void read() {
    int i;
    ifstream f("indep.in");
    f >> n;
    for (i = 1; i <= n; i++)
        f >> a[i];
    f.close();
}

bigNr last[1001], cur[1001];
int llung[1001], clung[1001];

int euclid(int a, int b) {
    if (b == 0)
        return a;
    else return euclid(b, a % b);
}

void solve() {
    int i, j, k, cmmdc, t;
    last[a[1]][++llung[a[1]]] = 1;
    for (i = 2; i <= n; i++) {
        for (j = 1; j <= 1000; j++) {
            clung[j] = llung[j];
            for (k = clung[j]; k >= 1; k--)
                cur[j][k] = last[j][k];
        }
        for (j = 1; j <= 1000; j++) {
            cmmdc = euclid(j, a[i]);
            clung[cmmdc] = max(clung[cmmdc], llung[j]);
            t = 0;
            for (k = 1; k <= clung[cmmdc]; k++) {
                t += cur[cmmdc][k] + last[j][k];
                cur[cmmdc][k] = t % baza;
                t /= baza;
            }
            while (t) {
                cur[cmmdc][++clung[cmmdc]] = t;
                t /= baza;
            }
        }
        for (j = 1; j <= 1000; j++) {
            llung[j] = clung[j];
            for (k = llung[j]; k >= 1; k--)
                last[j][k] = cur[j][k];
        }
    }
}

void output() {
    int i;
    ofstream g("indep.out");
    for (i = clung[1]; i >= 1; i--) 
        g << cur[1][i];
    g.close();
}   

int main() {
    read();
    solve();
    output();
    return 0;
}