Cod sursa(job #202159)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 august 2008 14:38:28
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>

#define FIN "pairs.in"
#define FOUT "pairs.out"
#define NMAX 1000001

int vec_ap[NMAX];
int N,max;
char prim[NMAX];
char nr[NMAX];
char xor[NMAX];
long long REZ;

int maxim(int a, int b)
{

if (a>b) return a;
    else return b;
}


void ciur()
{
int i,j;
for (i=2;i<max+1;++i)
    {
	for (j=2*i;j<max+1;j+=i)
	    vec_ap[i]+=vec_ap[j];
	if (!prim[i])
	{
	    xor[i]=1;
	    for (j=2*i;j<max+1;j+=i)
	    {
		prim[j]=1;
		if ((j/i)%i==0)
		    nr[j]=1;
		if (xor[j]==1)
		xor[j]=0;
		else
		xor[j]=1;
	    }
	}
	if (nr[i]) continue;
	if (!xor[i])
	    REZ+=(long long)vec_ap[i]*(vec_ap[i]-1)/2;
	    else
	    REZ-=(long long)vec_ap[i]*(vec_ap[i]-1)/2;
    }
}

void read()
{
int i,x;

freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);

scanf("%d", &N);

for (i=0;i<N;++i)
    {
    scanf("%d", &x);
    vec_ap[x]++;
    max=maxim(max,x);
    }

}

int main(void)
{
read();
REZ=(long long)N*(N-1)/2;
ciur();
printf("%lld", REZ);
return 0;
}