Pagini recente » Cod sursa (job #2945031) | Cod sursa (job #608618) | Cod sursa (job #2500244) | Cod sursa (job #218839) | Cod sursa (job #1524869)
#include <fstream>
#include <cstring>
#define BASE 10000
using namespace std;
ifstream f("indep.in");
ofstream g("indep.out");
short int n , v[505] , dp1[1005][305] , dp2[1005][305] , aux[305] , NMAX , nrc = 4;
void adun(short int a[] ,short int b[]);
void afis(short int a[]);
int gcd(int a , int b) {
int r = a % b;
while(r) {
a = b;
b = r;
r = a % b;
}
return b;
}
int main() {
aux[0] = 1;
aux[1] = 1;
f >> n;
for(int i = 1 ; i <= n ; ++i) {
f >> v[i];
NMAX = max(NMAX , v[i]);
}
for(int i = 1 ; i <= n ; ++i) {
if(i % 2 == 1) {
memset(dp1 , 0 , sizeof(dp1));
}
else {
memset(dp2 , 0 , sizeof(dp2));
}
for(int j = 1 ; j <= NMAX ; ++j) {
if(i % 2 == 0) {
adun(dp2[gcd(j , v[i])] , dp1[j]);
adun(dp2[j] , dp1[j]);
}
else {
adun(dp1[gcd(j , v[i])] , dp2[j]);
adun(dp1[j] , dp2[j]);
}
}
if(i % 2 == 1) {
adun(dp1[v[i]] , aux);
}
else {
adun(dp2[v[i]] , aux);
}
}
if(n % 2 == 1)
afis(dp1[1]);
else
afis(dp2[1]);
return 0;
}
void adun(short int a[] ,short int b[]) {
int t = 0 , put = 1;
for(int i = 1 ; i <= max(a[0] , b[0]) ; ++i) {
a[i] = b[i] + a[i] + t * put;
t = a[i] / BASE;
a[i] = a[i] % BASE;
}
a[0] = max(a[0] , b[0]);
while(t) {
a[++a[0]] = t % BASE;
t /= BASE;
}
}
void afis(short int a[]) {
if(a[0] == 0) {
g << 0;
}
//g << a[a[0]];
for(int i = a[0] ; i >= 1 ; --i) {
int nr = a[i] , cnt = 0;
if(nr == 0) {
cnt = 1;
}
while(nr) {
nr /= 10;
++cnt;
}
if(i != a[0])
for(int j = cnt + 1 ; j <= nrc ; ++j) {
g << 0;
}
g << a[i];
}
}