Cod sursa(job #779851)

Utilizator vendettaSalajan Razvan vendetta Data 18 august 2012 23:19:15
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("indep.in");
ofstream g("indep.out");

#define nmax 501
#define Valmax 1002

int n, a[nmax], dp[nmax][Valmax];


void citeste(){

    f >> n;
    for(int i=1; i<=n; i++) f >> a[i];

}

int cmmdc(int a, int b){

    if (b == 0) return a;
    return cmmdc(b, a%b);

}

void rezolva(){

    //nr de subsiruri pentru care cel mai mare numar care le dividie pe toate nr din subsir sa fie 1
    //dp[i][j] = numarul de subsirui din primele i avand cmmdc-ul j

    for(int i=1; i<=n; i++){
        dp[i][a[i]] = 1;//initalizez dinamica  : cazul cand il iau doar pe a[i];
        for(int j=1; j<Valmax; j++){//ma aflu in (i,j) continui i,j din i-1,j nu adaug a[i] si 2 : continui i,cmmdc(j,a[i]) cu i,j
            dp[i][j] += dp[i-1][j];//nu ma folosesc a[i];
            dp[i][ cmmdc(j,a[i]) ] += dp[i-1][j];//si acum ma folosesc de a[i];
        }
    }

    g << dp[n][1] << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}