Pagini recente » Cod sursa (job #391046) | Cod sursa (job #319585) | Cod sursa (job #504621) | Cod sursa (job #317948) | Cod sursa (job #95734)
Cod sursa(job #95734)
#include <stdio.h>
#include <string.h>
int n, v[512], prime[170], used[1024], cnt, nr, p = 1, sol[1000], maxval;
void gen();
void bkt(int);
void add(int*, int*);
void sub(int*, int*);
void mul(int*, int);
int main()
{
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
int i;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
scanf("%d", &v[i]);
if(v[i] > maxval)
{
maxval = v[i];
}
}
gen();
sol[0] = sol[1] = 1;
for(i = 1; i <= n; ++i)
{
mul(sol, 2);
}
--sol[1];
/*
for(i = sol[0]; i > 0; --i)
{
printf("%d", sol[i]);
}
printf("\n");
*/
bkt(1);
for(i = sol[0]; i > 0; --i)
{
printf("%d", sol[i]);
}
if(sol[0] == 0)
{
printf("0\n");
}
return 0;
}
void gen()
{
int i, j;
for(i = 2; i < 1024; ++i)
{
if(!used[i])
{
prime[++cnt] = i;
for(j = 2 * i; j < 1024; j += i)
{
used[j] = 1;
}
}
}
}
void bkt(int k)
{
int temp[1000];
memset(temp, 0, sizeof(temp));
temp[0] = temp[1] = 1;
if(k == cnt + 1)
{
int i, d = 0;
if(nr)
{
for(i = 1; i <= n; ++i)
{
if(v[i] % p == 0)
{
++d;
}
}
for(i = 1; i <= d; ++i)
{
mul(temp, 2);
}
--temp[1];
if(nr % 2)
{
sub(sol, temp);
}
else
{
add(sol, temp);
}
/*
printf("%d ---", p);
for(i = sol[0]; i > 0; --i)
{
printf("%d", sol[i]);
}
printf("\n");
*/
}
}
else
{
bkt(k + 1);
p *= prime[k];
++nr;
if(p <= maxval)
{
bkt(k + 1);
}
p /= prime[k];
--nr;
}
}
void mul(int* a, int b)
{
int i, t;
for(i = 1, t = 0; i <= a[0] || t; ++i, t /= 10)
{
a[i] = (t += a[i] * b) % 10;
}
a[0] = i - 1;
}
void add(int* a, int* b)
{
int i, t;
for(i = 1, t = 0; i <= a[0] || i <= b[0] || t; ++i, t /= 10)
{
a[i] = (t += a[i] + b[i]) % 10;
}
a[0] = i - 1;
}
void sub(int* a, int* b)
{
int i;
for(i = 1; i <= b[0]; ++i)
{
a[i] -= b[i];
if(a[i] < 0)
{
a[i] += 10;
--a[i + 1];
}
}
while(!a[a[0]] && a[0])
{
--a[0];
}
}