Pagini recente » Cod sursa (job #2377012) | Cod sursa (job #1708823) | Cod sursa (job #1343686) | Cod sursa (job #2215924) | Cod sursa (job #183449)
Cod sursa(job #183449)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 510
#define MAX_M 1010
#define MAX_C 100
#define BASE 1000000
#define FORMAT "%06d"
struct numar {
int cf[MAX_C];
void operator=(int a) {
for ( cf[0] = 1; a; a/=BASE, cf[0]++ )
cf[cf[0]] = a%BASE;
cf[0] --;
}
void operator=(numar b) {
memcpy(cf, b.cf, sizeof(int)*(b.cf[0]+1));
}
void operator+=(numar b) {
int i, t=0;
for ( i=1; i<=cf[0] || i<=b.cf[0] || t; ++i, t/=BASE )
cf[i] = ( t+= cf[i]+b.cf[i] ) % BASE;
cf[0] = i-1;
}
};
// Nr[x][y] = nr de subsiruri din primele x nr din sir care au cmmdc == y
// Nr[x][cmmdc(y, A[x])] += Nr[x-1][y]
numar Nr[2][MAX_M], un;
int A[MAX_N];
int n,i,j,mx;
int cmmdc(int a, int b) {
if ( a<b ) swap(a, b);
int r;
while ( b ) {
r = a%b; a = b; b = r;
}
return a;
}
void print(numar a) {
printf("%d", a.cf[a.cf[0]]);
for (i=a.cf[0]-1; i; --i)
printf(FORMAT, a.cf[i]);
}
int main() {
freopen("indep.in", "r", stdin);
freopen("indep.out","w",stdout);
scanf("%d", &n);
for ( i=0; i<n; ++i ) {
scanf("%d", A+i);
mx = max(A[i],mx);
}
un = 1;
Nr[0][A[0]] = 1;
for ( i=1; i<n; ++i ) {
int a1 = i&1, a2 = !a1;
for ( j=1; j<=mx; ++j ) {
Nr[a1][j] = Nr[a2][j];
int x = cmmdc(j,A[i]);
Nr[a1][x] += Nr[a2][j];
}
Nr[a1][A[i]] += un;
}
print(Nr[(n-1)&1][1]); printf("\n");
return 0;
}