Mai intai trebuie sa te autentifici.

Cod sursa(job #628131)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 31 octombrie 2011 17:55:52
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<vector>

#define maxn 100005
#define maxval 1000005
#define pb push_back

using namespace std;

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

int n,i,j,maxv,m,k,conf,nr1; long long nrp,r;
int A[maxn],Ind[maxval],nrd[maxval];
bool ciur[maxval];

vector<int>P[maxn];

int main () {
	
	f >> n;
	for ( i = 1 ; i <= n ; ++i ){
		f >> A[i]; Ind[A[i]] = i;
		maxv = maxv < A[i] ? A[i] : maxv;
	}
	
	for ( i = 2 ; i <= maxv ; ++i ){
		if ( !ciur[i] ){
			if ( Ind[i] )	P[Ind[i]].pb(i);
			for ( j = i + i ; j <= maxv ; j += i ){
				ciur[j] = 1;
				if ( Ind[j] )	P[Ind[j]].pb(i);
			}
		}
	}
	
	for ( i = 1 ; i <= n ; ++i ){
		m = P[i].size();
		for ( j = 1 ; j < (1<<m) ; ++j ){
			conf = j; r = 1;
			for ( k = 0 ; k < m ; ++k ){
				if ( conf & 1 ){
					r = r * P[i][k];
				}
				conf = conf >> 1;
			}
			++nrd[r];
		}
	}
	
	for ( i = 1 ; i <= n ; ++i ){
		m = P[i].size();
		for ( j = 1 ; j < (1<<m) ; ++j ){
			conf = j; r = 1; nr1 = 0;
			for ( k = 0 ; k < m ; ++k ){
				if ( conf & 1 ){
					r = r * P[i][k]; ++nr1;
				}
				conf = conf >> 1;
			}
			r = nrd[r] - 1;
			if ( nr1 & 1 ){
				nrp += r;
			}
			else{
				nrp -= r;
			}
		}
	}
	
	nrp = 1LL*n*(n-1)/2 - nrp/2;
	g << nrp << "\n";
	
	f.close();
	g.close();
	
	return 0;
}