Cod sursa(job #1746116)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 22 august 2016 17:56:22
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#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;
}