Cod sursa(job #1348495)

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

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

const int N = 505, Nr = 1005, cifre = 50, 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;
            }
            for (int i = a[0]; i; --i)
                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();
}