Pagini recente » Cod sursa (job #3186149) | Cod sursa (job #3129386) | Cod sursa (job #2457248) | Cod sursa (job #1503138) | Cod sursa (job #3190289)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
const int LMAX = 505;
int dp[2][2*LMAX][170], aux[170] = {1, 1};
void afis(int b[]) {
for (int i = b[0]; i >= 1; i--) {
fout<<b[i];
}
if (b[0] == 0) fout<<0;
}
void sum(int b[], int c[]) {
//b = b + c
/*if (b[0] && c[0]) {
afis(b);
fout<<"+";
afis(c);
fout<<"=";
if (b[1] == 4) {
fout<<endl<<"opa-"<<c[0]<<" "<<c[1]<<endl;
}
}*/
b[0] = max(b[0], c[0]);
int r = 0;
for (int i = 1; i <= b[0]; i++) {
b[i] = b[i] + c[i] + r;
r = b[i]/10;
b[i] = b[i]%10;
}
if (r) {
b[0]++;
b[b[0]] = 1;
}
/*if(b[0] && c[0]) {
afis(b);
fout<<endl;
}*/
}
void copie(int b[], int c[]) {
for (int i = 1; i <= c[0]; i++) {
b[i] = c[i];
}
b[0] = c[0];
}
//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, j, x, i;
bool nrelem;
fin>>n;
for (i = 1; i <= n; i++) {
fin>>x;
nrelem = i%2;
for (j = 1; j <= 1000; j++) {
copie(dp[nrelem][j], dp[1-nrelem][j]);
}
for (j = 1; j <= 1000; j++) {
///nu adaugam al i ulea element
//sum(dp[nrelem][j],dp[1-nrelem][j]);
///adaugam al i ulea element
sum(dp[nrelem][cmmdc(x, j)],dp[1-nrelem][j]); ///pt ca la fiecare subsecv de cmmdc j fac cmmdc cu a[i]
}
///fac o noua secv cu a[i]
sum(dp[nrelem][x],aux);
}
afis(dp[n%2][1]);
fin.close();
fout.close();
return 0;
}