Cod sursa(job #1394059)

Utilizator faker99Fache Adrian faker99 Data 19 martie 2015 23:11:57
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#define NRMAX 1000005
#define NMAX 100005
using namespace std;

int n,k,Max,v;
int nr[NRMAX],uz[NRMAX];
bool viz[NRMAX],fol[NRMAX];

void ciur()
{
   for(int i = 2; i <= Max; ++i)
   {
       if (viz[i] == 0)
       {
           for(int j = i; j <= Max; j += i)
           {
               ++nr[j];
               viz[j]=1;
               if(j % (i*i) == 0) fol[j]=1;
           }
       }
   }
}

int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    scanf("%d",&n);
    Max = 0;
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d",&v);
        uz[v]=1;
        if (v > Max) Max = v;
    }

    ciur();

    long long sol = 0;
    for(int i = 2; i <= Max; ++i)
    {
        if(fol[i] == 0)
        {
            k = 0;
            for(int j = i; j <= Max; j += i)
                k += uz[j];

            if(nr[i] & 1)
            {
                sol += ((1ll * k * (k-1)) / (2 * 1ll));
            }
            else
            {
                 sol -= ((1ll * k * (k-1)) / (2 * 1ll));
            }
        }
    }

    long long rez = ((1ll * n * (n-1)) / (2 * 1ll)) - sol;

    printf("%lld\n",rez);
    return 0;
}