Cod sursa(job #917976)

Utilizator veleanduAlex Velea veleandu Data 18 martie 2013 15:25:26
Problema Pairs Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

#define max_val 1000005
#define max_n 100005
#define FORIT( it,v ) for(typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it )

vector<int> Div, Desc;
bool Viz[max_val];
int Ap[max_val],El[max_n], Last[max_val];

int n,i,j,c,nr,ind,rez,act;

void desc( int nr ){
	int c=nr, d=0;
	Desc.clear();
	if( nr == 1 )
		return ;
    Desc.push_back( Last[nr] );
 	while( c!=1 && ( (c%Last[nr]) == 0 ) )
		c/=Last[nr];
	while( c!= 1 ){
		if( c % Div[d] == 0 ){
			Desc.push_back( Div[d] );
			while( c%Div[d] == 0 ){
				c/=Div[d];
			}
		}
		d++;
	}
}

int main(){
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d", &n );
	for( i=1; i<=n; ++i ){
		scanf("%d", &El[i] );
	}
	Last[1]=1;
	for( i=2; i<max_val; ++i ){
		if( !Viz[i] ){
			Div.push_back(i);
			for( j=i; j<max_val; j+=i ){
				Viz[j]=1;
				Last[j]=i;
			}
		}
	}
	for( i=1; i<=n; ++i ){
		desc( El[i] );
		for( j=1; j<(1<<(Desc.size()) ); ++j ){
			nr=1;
			for( c=0; c<Desc.size(); ++c ){
				if( j&(1<<c) ){
					nr*=Desc[c];
				}
			}
			Ap[nr]++;
		}
	}
	for( i=1; i<=n; ++i ){
		act=0;
		desc( El[i] );
		for( j=1; j< (1<<(Desc.size() )); ++j ){
			ind=0;
			nr=1;
			for( c=0; c<Desc.size(); ++c ){
				if( (1<<c)&j ){
					ind++;
					nr*=Desc[c];
				}
			}
			if( (ind&1) )
				act+=Ap[nr];
			else
				act-=Ap[nr];
		}
		rez+=n-act;
	}
	printf("%d\n",rez/2);
	return 0;
}