Pagini recente » Diferente pentru utilizator/nando intre reviziile 21 si 28 | Diferente pentru utilizator/cristy94 intre reviziile 30 si 54 | popa | Istoria paginii utilizator/cosminono | Cod sursa (job #3189968)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
const int LMAX = 505;
struct nummari{
int v[170];
};
nummari dp[LMAX][2*LMAX];
void sum(nummari &a, nummari b) {
int r = 0;
for (int i = 1; i <= max(a.v[0], b.v[0]); i++) {
a.v[i] = (a.v[i] + b.v[i] + r)%10;
r = (a.v[i] + b.v[i] + r)/10;
}
a.v[0] = max(a.v[0], b.v[0]);
if (r) {
a.v[0]++;
a.v[a.v[0]] = 1;
}
}
void afis(nummari a) {
for (int i = 1; i <= a.v[0]; i++) {
fout<<a.v[i];
}
}
int a[LMAX];
//dp[i][j] nr de subsecvente cu primele i elemenete care au cmmdc j
int cmmdc(int a, int b) {
int r;
while (b) {
r = a%b;
a = b;
b = r;
}
return a;
}
int main() {
int n, i, j;
fin>>n;
for (i = 1; i <= n; i++) {
fin>>a[i];
for (j = 1; j <= 1000; j++) {
///nu adaugam al i ulea element
sum(dp[i][j],dp[i-1][j]);
///adaugam al i ulea element
sum(dp[i][cmmdc(a[i], j)],dp[i-1][j]); ///pt ca la fiecare subsecv de cmmdc j fac cmmdc cu a[i]
}
///fac o noua secv cu a[i]
nummari aux;
aux.v[0] = aux.v[1] = 1;
sum(dp[i][a[i]],aux);
}
afis(dp[n][1]);
fin.close();
fout.close();
return 0;
}