Cod sursa(job #229655)

Utilizator cotofanaCotofana Cristian cotofana Data 10 decembrie 2008 22:46:03
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#define NMAX 1000001

int N, x[NMAX]={0}, Max;
long long sol, aux;
char P[NMAX]={0}, D[NMAX]={0}, R[NMAX]={0};
/*x[i]=nr de el ale multimii ce se divid prin i
  P[i]=0 daca i este prim,1 altfel
  D[i]=0 daca i are un numar par de divizori primi,1 altfel
  R[i]=0 daca fiecare factor prim din desc lui i apare la puterea 1,1 altfel*/
int max(int A,int B)
{
	return A>B?A:B;
}
int main()
{
	int i,j;
    	freopen("pairs.in", "r", stdin);
    	freopen("pairs.out", "w", stdout);
    	scanf("%d\n", &N);
    	for (i=1, Max=0; i<=N; ++i)
     	{
		scanf("%d", &j);
		x[j]=1;
		Max=max(Max,j);
	}
    	sol=(long long)N*(N-1)/2;
    	for (i=2; i<=Max; ++i)
	{
      		for (j=2; j<=(Max/i); ++j) x[i]+=x[i*j];
      		if (!P[i])
       			for (j=2, D[i]=1; j<=(Max/i); ++j)
			{
        			P[j*i]=1;
				D[j*i]=1-D[j*i]; 
        			if (j%i==0) R[j*i]=1;
			}
      		if (R[i]) continue;
      		aux=(long long)x[i]*(x[i]-1)/2;
      		if (!D[i]) sol+=aux;
            	else sol-=aux;
    	}
    	printf("%lld\n", sol);    
    	return 0;
}