Cod sursa(job #1022439)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 5 noiembrie 2013 14:08:45
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<fstream>

using namespace std;

#define max_n 1000100

ifstream f("pairs.in");
ofstream g("pairs.out");

int n , x , max_v , k , ok;
bool Fr[max_n] , V[max_n] , U[max_n];
int Prim[max_n] , Nr_p[max_n];
long long nr , prod;


void read(){
	
	f>>n;
	
	for( int i = 1 ; i <= n ; i++ ){
		f>>x; Fr[x] = 1;
		if( x > max_v )
			max_v = x;
	}
	
}

int main(){
	
	read();
	
	long long i , j;
	
	for( i = 2 ; i <= max_v ; i++ ){
		if( V[i] == 0 ){
			Prim[++k] = i;ok = 1;
			for( j = i ; j <= max_v ; j += i ){
				V[j] = 1;
				if( Fr[j] )
					ok = 0;
				Nr_p[j]++;
			}
			if(ok)
				k--;
		}
	}
	
	for( i = 1 ; i <= k ; i++ ){
		for( j = ((long long)Prim[i])*Prim[i] ; j <= max_v ; j += ((long long)Prim[i])*Prim[i] )
			U[j] = 1;
	}
	
	long long total = ((long long)n-1)*n/2;
	
	for( i = 2 ; i <= max_v ; i++ ){
		if( U[i] == 0 ){
			nr = 0;
			for( j = i ; j <= max_v ; j += i )
				if(Fr[j]) 
					nr++;
			if( Nr_p[i] % 2 ){
				total -= nr*(nr-1)/2;
			}
			else{
				total += nr*(nr-1)/2;
			}
		}
	}
	
	
	g<<total;
	
	return 0;
}