Pagini recente » Cod sursa (job #495980) | Cod sursa (job #1455567) | Clasament simulare-cartita-38 | Cod sursa (job #2907976) | Cod sursa (job #122751)
Cod sursa(job #122751)
#include <stdio.h>
#include <string.h>
const int N_MAX = 512;
const int V_MAX = 1024;
int v[N_MAX];
int a[2][V_MAX][N_MAX];
inline int cmmdc(int a, int b)
{
if (b == 0) return a;
else return (cmmdc(b, a % b));
}
void ADD(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0] || i <= B[0] || t; i ++, t /= 10) {
A[i] = (t += (A[i] + B[i]) % 10);
}
A[0] = i - 1;
}
int unu[N_MAX];
int main()
{
freopen("indep.in", "r", stdin);
#ifndef _SCREEN_
freopen("indep.out", "w", stdout);
#endif
int N, i, MAX = 0;
scanf("%d\n", &N);
for (i = 1; i <= N; i ++) {
scanf("%d\n", &v[i]);
if (v[i] > MAX) MAX = v[i];
}
int j, cur = 1, ant = 0;
unu[0] = 1, unu[1] = 1;
a[0][v[1]][0] = 1, a[0][v[1]][1] = 1;
for (i = 2; i <= N; i ++) {
memset(a[cur], 0, sizeof(a[cur]));
for (j = 1; j <= MAX; j ++) {
ADD(a[cur][j], a[ant][j]);
ADD(a[cur][cmmdc(j, v[i])], a[ant][j]);
}
ADD(a[cur][v[i]], unu);
if (cur == 1) cur = 0;
else cur = 1;
if (ant == 0) ant = 1;
else ant = 0;
}
for (i = a[ant][1][0]; i >= 1; i --) {
printf("%d", a[ant][1][i]);
}
printf("\n");
return 0;
}