Pagini recente » Cod sursa (job #1942449) | Cod sursa (job #54306) | Cod sursa (job #2658965) | Cod sursa (job #133183) | Cod sursa (job #1524245)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N = 501, SIZE = 32000;
int dp [2][1002][200], a [N], unu [9];
class myIfstream {
private :
char buffer [SIZE];
FILE *input;
int cursor;
void advance () {
++ cursor;
if (cursor == SIZE) {
cursor = 0;
fread (buffer, 1, SIZE, input);
}
}
public :
myIfstream ();
myIfstream (const char *inputName) {
input = fopen (inputName, "r");
fread (buffer, 1, SIZE, input);
cursor = 0;
}
myIfstream &operator >> (int &value) {
value = 0;
while (!(buffer [cursor] >= '0' && buffer [cursor] <= '9'))
advance ();
while (buffer [cursor] >= '0' && buffer [cursor] <= '9') {
value = value * 10 + buffer [cursor] - '0';
advance ();
}
return *this;
}
};
inline int cmmdc (int x, int y) {
int r;
while (y) {
r = x % y;
x = y;
y = r;
}
return x;
}
void adunare (int x [], int y [], int z []) {
int i, tr, s, lim;
tr = 0;
lim = max (x [0],y [0]);
for (i = 1; i <= lim; i ++) {
s = 0;
if (i <= x [0])
s = s + x [i];
if (i <= y [0])
s = s + y [i];
s = s + tr;
z [i] = s % 10;
tr = s / 10;
}
z [0] = lim;
while (tr) {
z [++ z [0]] = tr % 10;
tr = tr / 10;
}
}
bool estezero (int x []) {
if (x [0] == 1 && x [1] == 0)
return 1;
if (x [0] == 0)
return 1;
return 0;
}
int main () {
int n, i, x, j, l1, l2;
myIfstream fin ("indep.in");
freopen ("indep.out", "w", stdout);
fin >> n;
unu [0] = unu [1] = 1;
for (i = 1; i <= n; i ++)
fin >> a [i];
dp [1][a [1]][0] = dp [1][a [1]][1] = 1;
for (i = 2; i <= n; i ++) {
l1 = i % 2;
l2 = (i - 1) % 2;
memcpy (dp [l1], dp [l2], sizeof (dp [l2]));
adunare (dp [l1][a [i]], unu, dp [l1][a [i]]);
for (j = 1; j <= 1000; j ++)
if (estezero (dp [l2][j]) == 0) {
x = cmmdc (j, a [i]);
adunare (dp [l1][x], dp [l2][j], dp [l1][x]);
}
}
for (i = dp [n % 2][1][0]; i >= 1; i --)
printf ("%d", dp [n % 2][1][i]);
if (dp [n % 2][1][0] == 0)
printf ("0");
printf ("\n");
return 0;
}