Cod sursa(job #109330)

Utilizator devilkindSavin Tiberiu devilkind Data 25 noiembrie 2007 10:16:35
Problema Pairs Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.49 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define NMAX 100020

long int a[NMAX],h[NMAX*10],pr[NMAX],k,n,m,v[NMAX];
char ax[NMAX*10];
long long i,j,sol,sol2;


void ciur()
{

for (i=2;i<=m;i++)
        ax[i]=1;

for (i=2;i<=m;i++)
       if (ax[i])
        {
        pr[ ++pr[0] ]=i;
        for (j=i*i;j<=m;j+=i)
                ax[j]=0;
        }
}

void back(long int nivel, long int nr1, long int nr)
{
if (nivel==k+1)
        {
        if (nr1==0) return;

        if (nr1%2==0) sol2-=h[nr];
                else sol2+=h[nr];

        h[nr]++;
        return;
        }

back(nivel+1,nr1,nr);
back(nivel+1,nr1+1,nr*v[nivel]);
}

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

       scanf("%ld",&n);

       for (i=1;i<=n;i++)
                scanf("%ld",&a[i]);

        m=2000;

        sort(a+1,a+n+1);

        ciur();

        for (i=1;i<=n;i++)
                {
                k=a[i];
                v[0]=0;
                for (j=1;pr[j]*pr[j]<=k;j++)
                        {
                        if (k%pr[j]==0)
                                {
                                v[ ++v[0] ] = pr[j];
                                for (;k%pr[j]==0;k/=pr[j]);
                                }
                        }

                if (k>1) v[++v[0] ] = k;

                k=v[0];

                sol2=0;
                back(1,0,1);
                sol+=i-1-sol2;
                }
        printf("%lld",sol);
        return 0;
}