Cod sursa(job #1348509)

Utilizator tudorv96Tudor Varan tudorv96 Data 19 februarie 2015 18:54:17
Problema Indep Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
using namespace std;

ifstream fin ("indep.in");
ofstream fout ("indep.out");

const int N = 505, Nr = 1005, cifre = 25, base = 1e9;

class big {
    public:
        int a[cifre];
        big() {
            for (int i = 0; i < cifre; ++i)
                a[i] = 0;
        }
        void increase(int *b) {
            int t = 0;
            for (int i = 1; i <= (a[0] > b[0] ? a[0] : b[0]) + 1; ++i) {
                int tmp = a[i] + b[i] + t;
                a[i] = tmp % base;
                t = (tmp > base - 1) ? 1 : 0;
            }
            int MAX = a[0] < b[0] ? b[0] : a[0];
            a[0] = a[MAX+1] ? (MAX+1) : MAX;
        }
        void increase () {
            int i = 1;
            a[i]++;
            while (a[i] == base) {
                a[i] = 0;
                a[++i]++;
            }
            if (i)
                a[0] = max(a[0], i);
        }
        void display() {
            if (!a[0]) {
                fout << 0;
                return;
            }
            fout << a[a[0]];
            for (int i = a[0] - 1; i; --i) {
                int cif = 0, aux = a[i];
                while (aux) {
                    cif++;
                    aux /= 10;
                }
                for (int k = 8; k > cif; --k)
                    fout << 0;
                fout << a[i];
            }
        }
} d[N][Nr];

int n;

int gcd(int a, int b) {
    if (!b)
        return a;
    else
        return gcd(b, a % b);
}

int main() {
    fin >> n;
    for (int x, i = 1; i <= n; ++i) {
        fin >> x;
        for (int j = 1; j <= Nr; ++j) {
            d[i][gcd(x, j)].increase (d[i-1][j].a);
            d[i][j].increase(d[i-1][j].a);
        }
        d[i][x].increase();
    }
    d[n][1].display();
}