Pagini recente » Cod sursa (job #2031825) | Cod sursa (job #2819795) | Cod sursa (job #1398046) | Cod sursa (job #1247532) | Cod sursa (job #2091220)
#include <stdio.h>
const int nrcf = 65, lim = 1001, bz = 1000;
char ciur[lim];
int cmmdc[lim][lim];
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");
for(int i = 1; i <= 1000; i++)
for(int j = 1; j <= 1000; j++){
if(j < i)
cmmdc[i][j] = cmmdc[j][i];
else
cmmdc[i][j] = func(i, j);
}
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++)
d[aux][cmmdc[x][j]] = d[aux][cmmdc[x][j]] + 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, "%03d", ans.cf[i]);
return 0;
}