Cod sursa(job #1508373)

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