Cod sursa(job #1892108)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 24 februarie 2017 18:15:45
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
using namespace std;

const int VMAX = 1024,
          LMAX = 256;

int n;

int f[VMAX], r[LMAX], t[LMAX], tt[LMAX], pinex[VMAX];

void add(int a[], int b[]) {
    int la, lb, c;

    la = a[0];
    lb = b[0];
    c = 0;

    for (int i = 1; i <= max(la, lb) || c > 0; ++i) {
        if (i > la) a[i] = 0;
        if (i > lb) b[i] = 0;
        a[0] = i;
        a[i]+= b[i] + c;
        c = a[i] / 10;
        a[i]%= 10; } }

void sub(int a[], int b[]) {
    int la, lb, c;

    la = a[0];
    lb = b[0];
    c = 0;

    for (int i = 1; i <= max(la, lb) || c > 0; ++i) {
        if (i > la) a[i] = 0;
        if (i > lb) b[i] = 0;
        a[i]-= b[i] + c;
        if (a[i] < 0) {
            c = 1;
            a[i]+= 10; }
        else {
            c = 0; } }

    a[0] = 1;
    for (int i = 1; i <= max(la, lb); ++i) if (a[i])
        a[0] = i; }

int main() {
    ifstream fi("indep.in");
    ofstream fo("indep.out");
    int n, s, tmp;

    fi >> n;
    for (int i = 1; i <= n; ++i) {
        fi >> tmp;
        ++f[tmp]; }

    for (int i = 2; i < VMAX; ++i) if (!pinex[i])
        for (int j = i; j < VMAX; j+= i)
            ++pinex[j];

    for (int i = 2; i < VMAX; ++i)
        pinex[i] = (pinex[i] % 2) ? 1 : -1;

    for (int i = 2; i * i < VMAX; ++i)
    for (int j = i * i; j < VMAX; j+= i * i)
        pinex[j] = 0;

    r[0] = 1;
    for (int i = 2; i < VMAX; ++i) if (pinex[i]) {
        s = 0;
        for (int j = i; j < VMAX; j+= i)
            s+= f[j];
        t[0] = 1;
        t[1] = 1;
        for (int j = 0; j < s; ++j) {
            memcpy(tt, t, sizeof t);
            add(t, tt); }
        tt[0] = 1;
        tt[1] = 1;
        sub(t, tt);

        if (pinex[i] == 1)
            add(r, t);
        else
            sub(r, t); }

    t[0] = 1;
    t[1] = 1;
    for (int i = 1; i <= n; ++i) {
        memcpy(tt, t, sizeof t);
        add(t, tt); }
    sub(t, r);
    r[0] = 1;
    r[1] = 1;
    sub(t, r);

    for (int i = t[0]; i > 0; --i)
        fo << t[i];
    fo << '\n';

    return 0; }