Pagini recente » Cod sursa (job #229611) | Cod sursa (job #2454811) | Cod sursa (job #2446182) | Cod sursa (job #409988) | Cod sursa (job #1746060)
#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++) {
t += a[i] + op.a[i];
a[i] = t%BASE;
t /= BASE;
}
if (t)
a[++a[0]] = t;
}
void substract(huge op)
{
int t = 0;
for (int i = 1; i <= op.a[0]; i++) {
t += a[i]-op.a[i];
a[i] = (t < 0) ? BASE+t : t;
t = (t < 0) ? -1 : 0;
}
a[op.a[0]+1] += t;
while (a[0] && a[a[0]] == 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;
}