Cod sursa(job #1508735)

Utilizator akaprosAna Kapros akapros Data 22 octombrie 2015 21:54:11
Problema Pairs Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bitset>
#define maxN 100002
#define maxM 1000002
using namespace std;
int sol, n, i, j, m, mv, v, x[maxM], cop[maxM];
int w[maxM];
bitset < maxM > a;
void read()
{
    freopen("pairs.in", "r", stdin);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &v);
        mv = max(mv, v);
        cop[i] = v;
        a[v] = 1;
    }
    for (i = 1; i <= mv; ++ i)
        cop[i] = i;
}
void sifter()
{
    int l;
    for (i = 2; i <= mv; ++ i)
        if (!w[i])
    {
        l = 0;
        for (j = i; j <= mv; j += i)
        {
            ++ w[j];
            if (a[j] == 1)
                ++ l;
            cop[j] /= i;
        }
        x[i] = l;
    }
    else
    {
        l = 0;
        for (j = i; j <= mv; j += i)
            l += (a[j] != 0);
        x[i] = l;
    }
}
int c(int x)
{
    return (x * (x - 1)) / 2;
}
void solve()
{
    sifter();
    sol = c(n);
    for (i = 2; i <= mv; ++ i)
        if (cop[i] == 1)
    {
        if (w[i] % 2)
            sol -= c(x[i]);
        else
            sol += c(x[i]);
    }
}
void write()
{
    freopen("pairs.out", "w", stdout);
    printf("%d", sol);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}