Pagini recente » Cod sursa (job #1172015) | Cod sursa (job #1300176) | Cod sursa (job #2212041) | Cod sursa (job #2148693) | Cod sursa (job #1746116)
#include <iostream>
#include <cstdio>
#define MAXN 550
#define MAXSIZE 1050
#define BASE 10
using namespace std;
struct huge
{
int a[MAXSIZE];
huge()
{
for (int i = 0; i < MAXSIZE; i++)
a[i] = 0;
}
// huge(const huge& cpy)
// {
// a[0] = cpy.a[0];
// for (int i = 1; i <= a[0]; i++)
// a[i] = cpy.a[i];
// }
void add(huge op)
{
a[0] = max(a[0], op.a[0]);
int t = 0;
for (int i = 1; i <= a[0]; i++) {
if (i > op.a[0]) op.a[i] = 0;
t += a[i] + op.a[i];
a[i] = t%BASE;
t /= BASE;
}
if (t)
a[++a[0]] = t;
}
void substract(huge op)
{
int i, t = 0;
for (i = 1; i <= a[0]; i++) {
a[i] -= ((i <= op.a[0]) ? op.a[i] : 0) + t;
a[i] += (t = a[i] < 0) * BASE;
}
for (; a[0] > 1 && !a[a[0]]; a[0]--);
}
void print()
{
if (a[0] == 0) {
printf("0\n");
return;
}
for (int i = a[0]; i; --i)
printf("%d", a[i]);
printf("\n");
}
};
int n, a[MAXN];
huge pre[MAXSIZE];
int par[MAXSIZE], card[MAXSIZE];
void prepare()
{
pre[0].a[0] = pre[0].a[1] = 1;
for (int i = 1; i < MAXSIZE; i++) {
pre[i] = huge(pre[i-1]);
pre[i].add(pre[i-1]);
}
for (int i = 1; i < MAXSIZE; i++)
pre[i].substract(pre[0]);
pre[0] = huge();
for (int i = 2; i < MAXSIZE; i++) {
int x = i;
for (int d = 2; x > 1; d++) {
if (x%d == 0) {
x /= d;
par[i]++;
}
if (x%d == 0)
{
par[i] = 0;
break;
}
}
}
for (int i = 1; i <= n; i++) {
for (int d = 1; d < MAXSIZE; d++)
if (a[i] % d == 0)
card[d]++;
}
//for (int i = 1; i < 100; i++)
//printf("%d %d\n", par[i], card[i]);
}
void solve()
{
huge solutie;
solutie = pre[n];
for (int i = 2; i < MAXSIZE; i++) {
if (card[i] == 0 || par[i] == 0) continue;
if (par[i] & 1) {
solutie.substract(pre[card[i]]);
}
else {
solutie.add(pre[card[i]]);
}
}
solutie.print();
}
int main()
{
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
prepare();
solve();
return 0;
}