Cod sursa(job #1018806)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 octombrie 2013 23:19:38
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

#define maxn 100001
#define maxv 1000001

using namespace std;

ifstream fin("pairs.in");
ofstream fout("pairs.out");

bool sieve[maxv],v[maxv];
int p[maxn],fac[maxn],nr[maxv],mark[maxv],maxval=0;
int t,tt,prod,n,x;
long long s;

void erathostenes (int n)
{
    t=1;
    p[1] = 2;

    for (int i=3; i<=n; i+=2)
    {
        int ok=0;
        if (!sieve[i])
        {
            ok |=  v[i];
            for (int j=i+i; j<=n; j+=i)
            {
                sieve[j] = 1;
                ok |= v[j];
            }

            if (ok)
            {
                p[++t] = i;
            }
        }
    }
}


void back (int k, int cnt)
{
    if (prod > maxval)
        return;

    for (int i=k; i<=t; ++i)
    {
        prod *= p[i];
        back (i+1,cnt+1);
        prod /= p[i];
    }

    if (prod != 1)
    {
        fac[++tt] = prod;
        nr[prod] = cnt;
    }
}

int main()
{
    fin>>n;

    for (int i=1; i<=n; ++i)
    {
        fin>>x;
        v[x]=1;

        maxval = max (x,maxval);
    }

    erathostenes (maxval);

    prod = 1;

    back (1,0);

    for (int i=1; i<=tt; ++i)
    {
        for (int j=fac[i]; j<=maxval; j+=fac[i])
        {
            if (v[j]) mark[fac[i]]++;
        }
    }

    s=0;

    for (int i=1; i<=maxval; ++i)
    {
        if (nr[i]%2)
        {
            s += (mark[i]*(mark[i]-1)/2);
        }
        else
        {
            s -= (mark[i]*(mark[i]-1)/2);
        }
    }


    fout<<1LL*n*(n-1)/2-s;
}