Cod sursa(job #1235927)

Utilizator smaraldaSmaranda Dinu smaralda Data 30 septembrie 2014 22:11:14
Problema Indep Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>

const int NMAX = 505, VALMAX = 1001, NCIF = 40, BASE = 1e9;

class HUGE {
    public:
        int c[NCIF];

        void operator = (int n) {
            c[0] = 0;
            do {
                c[ ++c[0]] = n % BASE;
                n /= BASE;
            }while(n);
        }
        
        void operator += (const HUGE &other) {
            int i, t;
            
            if(other.c[0] > c[0])
                c[0] = other.c[0];
            t = 0;
            for(i = 1; i <= c[0]; ++ i) {
                c[i] += other.c[i] + t;
                t = c[i] / BASE;
                c[i] %= BASE;
            }
            while(t) {
                c[++ c[0]] = t % BASE;
                t /= BASE;
            }
        }

        void print() {
            int i;

            printf("%d", c[c[0]]);
            for(i = c[0] - 1; i >= 1; -- i)
                printf("%09d", c[i]);
        }
} d[NMAX][VALMAX];
int x[NMAX];

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

int main() {
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    int res, n, i, j;

    scanf("%d", &n);
    for(i = 1; i <= n; ++ i)
        scanf("%d", &x[i]);

    for(i = 1; i <= n; ++ i) {
        d[i][x[i]] = 1;
        for(j = 1; j < VALMAX; ++ j) {
            d[i][gcd(j, x[i])] += d[i - 1][j];
            d[i][j] += d[i- 1][j];
        }
    }

    d[n][1].print();
    return 0;
}