Pagini recente » Cod sursa (job #149892) | Cod sursa (job #193775) | Cod sursa (job #1553622) | Statistici Buia Aurelian (relutz) | Cod sursa (job #174464)
Cod sursa(job #174464)
#include <stdio.h>
#define nmax 1000
unsigned long long p[nmax], A[nmax], sol[nmax];
unsigned long long N, ans, maxim;
void do_backtrack_dude(int where, int pos, unsigned long long prod, int count)
{
int i, c;
if (prod <= 1000 && prod <= maxim)
{
if (count > 0)
{
for (i = 1, c = 0; i <= N; ++i)
if (A[i] % prod == 0)
++c;
c = (1<<c)-1;
if (count%2)
ans -= c;
else
ans += c;
}
}
else
return;
for (i = pos; i <= p[0]; ++i)
{
if (prod * p[i] <= 1000)
{
sol[where] = p[i]; // scop didactic
do_backtrack_dude(where+1, i+1, prod*p[i], count+1);
sol[where] = 0; // scop didactic
}
else
break;
}
}
void read()
{
int i;
freopen("indep.in" , "r", stdin);
scanf("%d", &N);
for (i = 1; i <= N; ++i)
{
scanf("%d", &A[i]);
maxim = A[i] > maxim? A[i]: maxim;
}
}
void solve()
{
int i, j, prim;
// scot numerele prime pana la 1000
for (p[++p[0]] = 2, i = 3; i <= 1000 && i <= maxim; i += 2)
{
for (prim = j = 2; prim && j <= p[0]; ++j)
if (i % p[j] == 0)
prim = 0;
if (prim)
p[++p[0]] = i;
}
// scot cate sunt egale cu fiecare combinare de numere prime
// adunand sau scazand functie de cum vreau eu
do_backtrack_dude(1, 1, 1, 0);
}
void write()
{
freopen("indep.out", "w", stdout);
ans = ((1 << N)-1) + ans;
printf("%llu\n", ans);
}
int main()
{
read();
solve();
write();
return 0;
}