Cod sursa(job #1021371)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 3 noiembrie 2013 18:58:45
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>


using namespace std;

#define max_n 1000100

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

int n , x , max_v , k , k1 , nr , ok , prod;
bool Fr[max_n] , V[max_n];
int Prim[100000] , Nr[max_n];

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

int desc( int i , int& prod ){
	
	int nr = 0;
	
	prod = 1;
	
	for( int j = 0 ; j < k ; j++ ){
		if( i & (1<<j) ){
			nr++;
			prod *= Prim[j+1];
		}
	}
	
	return nr%2;
}

int main(){
	
	read();
	
	int i , j;
	
	for( i = 2 ; i <= max_v ; i++ ){
		if( V[i] == 0 ){
			Prim[++k] = i;
			for( j = i ; j <= max_v ; j += i ){
				V[j] = 1;
				if( Fr[j] )
					Nr[i]++;
			}
		}
		else{
			
			nr = i; ok = 1; k1 = 1;
			
			while( Prim[k1]*Prim[k1] <= i ){
				if( nr % Prim[k1] == 0 ){
					nr /= Prim[k1];
					if( nr % Prim[k1] == 0 ){
						ok = 0;
						break;
					}
				}
				k1++;
			}
			
			for( j = i ; ok && j <= max_v ; j += i )
				if( Fr[j] )
					Nr[i]++;
			
		}
	}
	
	long long total = (n-1)*n/2;
	
	for( i = 1 ; i < (1<<k) ; i++ ){
		
		ok = desc(i , prod);
		
		if( prod > max_v )
			continue;
		
		if( ok ){
			total -= (Nr[prod] * (Nr[prod] - 1) / 2);
		}
		else{
			total += (Nr[prod] * (Nr[prod] - 1) / 2);
		}
		
	}
	
	g<<total;
	
	return 0;
}