Cod sursa(job #1018711)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 octombrie 2013 21:51:33
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

#define maxn 100001
#define maxv 1000001

using namespace std;

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

int a[maxn],n,t,prod=1;
int sieve[maxv],v[maxv];
int p[maxn],nr[maxn],maxval;
long long s;

void erathostenes ()
{
    for (int i=2; i<=maxval; ++i)
    {
        if (!sieve[i])
        {
            if (v[i])
            {
                p[++t] = i;
                nr[i] ++;
            }
            for (int j=i+i; j<=maxval; j+=i)
            {
                if (v[j])
                {
                    if (!nr[i]) p[++t] = i;
                    nr[i] ++;
                }

                sieve[j] = 1;
            }
        }
    }
}

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 (cnt%2)
    {
        s += nr[prod]*(nr[prod]-1)/2;
    }
    else
    {
        s -= nr[prod]*(nr[prod]-1)/2;
    }
}

int main()
{
    fin>>n;

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

        maxval = max (a[i],maxval);
    }

    erathostenes ();

    back (1,0);

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