Pagini recente » Cod sursa (job #1559069) | Cod sursa (job #241744) | Istoria paginii runda/antrenament_1/clasament | Cod sursa (job #453392) | Cod sursa (job #779851)
Cod sursa(job #779851)
#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;
}