Pagini recente » Istoria paginii runda/oni2008 | Cod sursa (job #985302) | Cod sursa (job #2960464) | Cod sursa (job #1868972) | Cod sursa (job #2091273)
#include <stdio.h>
const int nrcf = 17, lim = 1001, bz = (int) 1e9;
inline int func(int a, int b){
int r;
while(b > 0){
r = a % b;
a = b;
b = r;
}
return a;
}
struct mare{
int cf[nrcf + 1];
int len;
void init(){
len = 0;
for(int i = 0; i < nrcf; i++)
cf[i] = 0;
}
mare operator +(mare b){
mare ans;
ans.init();
for(int i = 0; i < nrcf; i++){
ans.cf[i] += cf[i] + b.cf[i];
ans.cf[i + 1] = ans.cf[i] / bz;
ans.cf[i] %= bz;
if(ans.cf[i] != 0)
ans.len = i + 1;
}
return ans;
}
void operator =(mare b){
len = b.len;
for(int i = 0; i < nrcf; i++)
cf[i] = b.cf[i];
}
mare operator *(int b){
mare ans;
ans.init();
ans = *this;
int tr = 0;
for(int i = 0; i < nrcf; i++){
ans.cf[i] *= b;
ans.cf[i] += tr;
tr = ans.cf[i] / bz;
ans.cf[i] %= bz;
if(ans.cf[i] != 0)
ans.len = i + 1;
}
return ans;
}
};
mare d[2][lim];
int main()
{
FILE *fi = fopen("indep.in", "r"), *fo = fopen("indep.out", "w");
int n, x;
fscanf(fi, "%d", &n);
int aux = 0;
mare unu;
unu.init();
unu.len = 1; unu.cf[0] = 1;
for(int i = 0; i < n; i++){
fscanf(fi, "%d", &x);
for(int j = 1; j <= 1000; j++)
d[aux][j] = d[1 - aux][j];
for(int j = 1; j <= 1000; j++) {
int cmmdc = func(x, j);
d[aux][cmmdc] = d[aux][cmmdc] + d[1 - aux][j];
}
d[aux][x] = d[aux][x] + unu;
aux = 1 - aux;
}
mare ans = d[1 - aux][1];
fprintf(fo, "%d", ans.cf[ans.len - 1]);
for(int i = ans.len - 2; i >= 0; i--)
fprintf(fo, "%09d", ans.cf[i]);
return 0;
}