Cod sursa(job #109803)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 25 noiembrie 2007 12:43:26
Problema Pairs Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.49 kb
#include <cstdio>
#include <algorithm>


long i,n,j;
long A[100000];
/*
long brut1() {
	std::sort(A, A+n);
	nr = 0;
	for (i=0; i<n; ++i)
		for (j=i+1; j<n; ++j) {
			long x = A[i], y = A[j], r;
			while ( x ) { r=y%x; y=x; x=r; }
			if ( y==1 ) nr++;
		}
	return nr;
}

*/
char p[1000020>>4];
long Prim[80000];
  
long sieve(int n) {   
	int i, j, nr = 1;   
	for (i = 1; ((i * i) << 1) + (i << 1) <= n; i += 1)
		if ((p[i >> 3] & (1 << (i & 7))) == 0)
			for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1)
				p[j >> 3] |= (1 << (j & 7));
	Prim[0] = 2;
	for (i = 1; 2 * i + 1 <= n; ++i)     
		if ((p[i >> 3] & (1 << (i & 7))) == 0)
			Prim[nr++] = 2*i+1;   
	return nr;   
} 
/*
long Nr[100000];
long brut2() {
	std::sort(A, A+n);
	long k = sieve(A[n-1]+1);	
	for (i=0; i<n; ++i) Nr[i] = i;
	for (i=0; i<k; ++i) {
		long delta = 0;
		for (j=0; j<n; ++j)
			if ( A[j] % Prim[i] == 0 ) {
				Nr[j]-=delta;
				delta++;
			}
	}

	nr = 0;
	for (i=0; i<n; ++i)
		nr += Nr[i];
	return nr;
}
*/

long L[80000];
long long nr;

long long brut3() {
	long k = sieve(A[n-1]+1);	
	for (i=0; i<n; ++i) 
		for (j=0;j<k && A[i]>1;++j)
			if ( A[i]%Prim[j] == 0 ) 
				L[j] ++;
	nr = (long long)n*(n-1)/2;
	for (i=0; i<k; ++i)
		if ( L[i] )
			nr -= (long long)L[i]*(L[i]-1) / 2;
	return nr;
}


int main() {
	freopen("pairs.in", "r", stdin);
	scanf("%ld", &n);
	for (i=0; i<n; ++i)
		scanf("%ld", A+i);
	fclose(stdin);


	freopen("pairs.out", "w", stdout);
	printf("%lld\n", brut3());
	fclose(stdout);
	return 0;
}