Cod sursa(job #496913)

Utilizator andra23Laura Draghici andra23 Data 31 octombrie 2010 13:42:50
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
#include<iomanip>
#define nmax 505
#define imax 1005
#define r 1000000000

using namespace std;

unsigned int a[nmax], c1[imax][100], c2[imax][100], v[100];
ofstream g("indep.out");

int cmmdc(int a, int b){
    int rr = a%b;
    while (rr != 0){
        a = b;
        b = rr;
        rr = a%b;    
    }    
    return b;
}

void add(unsigned int a[], unsigned int b[]){
    int t = 0, i;
    for (i = 1; i <= a[0] || i <= b[0] || t != 0; i++){
        t = a[i] + b[i] + t;
        a[i] = t%r;
        t = t/r;
    } 
    a[0] = --i;  
}

void afisare(unsigned int a[]){
    g << a[a[0]]; 
    for (int i = a[0]-1; i >= 1; i--)
        g << setw(9) << setfill('0') << a[i];     
}

int main(){
    ifstream f("indep.in");
    
    int n;
    f >> n;
    
    int i, j, k;
    int max = 0;
    for (i = 1; i <= n; i++){
        f >> a[i];
        if (a[i] > max)
            max = a[i];
    } 
    
    c1[a[1]][0] = 1;
    c1[a[1]][1] = 1;
    c2[a[1]][0] = 1;
    c2[a[1]][1] = 1;
    v[0] = 1;
    v[1] = 1;
    
    for (i = 2; i <= n; i++){
        add(c2[a[i]], v);
        for (j = 1; j <= max; j++){
            k = cmmdc(a[i], j);
            //c2[k] = c2[k] + c1[j]; 
            add(c2[k], c1[j]);           
        }
        for (j = 1; j <= max; j++)
            for (int t = 0; t <= c2[j][0]; t++)
                c1[j][t] = c2[j][t];    
    }
    
    afisare(c2[1]);
    
    return 0;
}