Cod sursa(job #1132632)

Utilizator assa98Andrei Stanciu assa98 Data 3 martie 2014 19:07:35
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

class huge {
private:
    static const int BASE=1000000000;
    static const int MAX_SIZE=155;
    int a[MAX_SIZE];
public:
    huge() {
        memset(a,0,sizeof(a));
    }
    huge(int val) {
        memset(a,0,sizeof(a));
        a[0]=1;
        a[1]=val;
    }

    inline int size() {
        return a[0];
    }
    inline int operator[](const unsigned int poz) {
        return a[poz];
    }

    huge operator =(huge &b) {
        for(int i=0;i<=max(a[0],b[0]);i++) {
            a[i]=0;
            a[i]=b[i];
        }
        return *this;
    }

    huge operator +=(huge &b) {
        int t = 0, i;
        for(i=1;i<=a[0] || i<=b[0] || t;++i) { 
            t+=a[i]+b[i];
            a[i]=t%BASE;
            t/=BASE;
        }
        a[0]=i-1;
        return *this;
    }
};

void print(huge &x) {
    printf("%d",x[x.size()]);
    for(int i=x.size();i>1;i--) {
        printf("%09d",x[i]);
    }
    printf(" ");
}

const int MAX_N=510;
const int MAX_VAL=1010;

int gcd(int a,int b) {
    while(b) {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}

huge d[2][MAX_VAL];
int c[MAX_VAL][MAX_VAL];

int v[MAX_N];

int main() {
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    
    huge unu(1);
    for(int i=1;i<MAX_VAL;i++) {
        for(int j=i;j<MAX_VAL;j++) {
            c[i][j]=c[j][i]=gcd(i,j);
        }
    }
    
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&v[i]);
    }
    
    d[1][v[1]]=unu;
    for(int i=2;i<=n;i++) {
        int l=i&1;
        for(int j=1;j<MAX_VAL;j++) {
            d[l][j]=d[l^1][j];
        }

        for(int j=1;j<MAX_VAL;j++) {
            d[l][ c[j][v[i]] ]+= d[l^1][j];
        }
        d[l][v[i]]+=unu;
    }
    
    print(d[n&1][1]);

    return 0;
}