Cod sursa(job #1897320)

Utilizator antanaAntonia Boca antana Data 1 martie 2017 12:29:03
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <algorithm>

#define MAXE 100001
#define MAXN 1000001

using namespace std;

int sieve[MAXN], number[MAXN];
bool bad[MAXN], frq[MAXN];

int main()
{
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);

    int prime, n, m = -1, x;
    long long ans = 0, i;

    scanf("%d", &n);
    for(i=1; i<=n; ++i) {
        scanf("%d", &x);
        frq[x] = 1;
        if(m < x) m = x; }


    for(prime=1; prime<=m; ++prime)
        for(i=prime; i<=m; i+=prime)
            number[prime] += (frq[i]==1);

    for(prime=2; prime<=m; ++prime)
        if(!sieve[prime]) {
            for(i=prime; i<=m; i+=prime)
                sieve[i]++;
            for(i=1LL*prime*prime; i<=m; i+=prime*prime)
                bad[i] = 1; }

    for(i=1; i<=m; ++i){
        if(bad[i]) continue;
        else {
            if(sieve[i]&1) ans -= 1LL*number[i]*(number[i]-1);
            else ans += 1LL*number[i]*(number[i]-1); } }

    printf("%lld", ans/2);


    return 0;
}