Pagini recente » Cod sursa (job #1064170) | Cod sursa (job #2109805) | Cod sursa (job #2679945) | Cod sursa (job #1687244) | Cod sursa (job #2091286)
#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;
}
inline int maxim(int a, int b){
if(a > b)
return a;
return b;
}
struct mare{
int cf[nrcf];
int len;
void init(){
len = 1;
for(int i = 0; i < nrcf; i++)
cf[i] = 0;
}
mare operator +(mare b){
mare ans;
ans.init();
ans.len = maxim(len, b.len);
for(int i = 0; i < ans.len; i++){
ans.cf[i] += cf[i] + b.cf[i];
ans.cf[i + 1] = ans.cf[i] / bz;
ans.cf[i] %= bz;
}
if(ans.cf[ans.len] != 0)
ans.len++;
return ans;
}
void operator =(mare b){
len = b.len;
for(int i = 0; i < len; i++)
cf[i] = b.cf[i];
}
};
mare d[2][lim];
int main()
{
FILE *fi = fopen("indep.in", "r"), *fo = fopen("indep.out", "w");
int n, x;
fscanf(fi, "%d", &n);
if(n == 1){
fscanf(fi, "%d", &n);
if(n == 1)
fprintf(fo, "1");
else
fprintf(fo, "0");
return 0;
}
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;
}
if(d[1 - aux][1].len == 0 && d[1 - aux][1].cf[0] == 0){
fprintf(fo, "0");
return 0;
}
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;
}