Cod sursa(job #547756)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 6 martie 2011 17:57:59
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#define Nmax 1000010

int fact[Nmax>>3], v[Nmax], s[20] ;
bool viz[Nmax], ciur[Nmax] ;

int i,n,x,K,j; 
long long sol, P, Max, val ; 

void precalc()
{
	long long i,j ; 
	
	fact[++K] = 2 ; 
	
	for( i = 3 ;  i <= Max; i += 2 ) 
	{
		if( ciur[i] ) continue ; 
		fact[++K] = i ;
		
		for( j = i*i ; j <= Max ; j += (i<<1) ) 
			ciur[j] = true ; 
	}
}

void back ( int k ) 
{
	int i ;
	
	for( i = s[k-1] + 1  ; i <= K ; i++ )
	{
		s[k] = i ;
		
		P *= fact[i] ; 
		
		if( P <= Max )
		{
			val = ((1LL*v[P]*(v[P]-1))>>1);
			
			if( k & 1 ) 
				sol += val ;
			else
				sol -= val ;
			
			back(k+1);
			P /= fact[i];
		}
		else
		{
			P /= fact[i];
			break ;
		}
	}
}

int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	
	scanf("%d",&n);
	
	for( i = 1 ; i <= n ; i++ )
	{
		scanf("%d",&x);
		viz[x] = true ; 
		if( x > Max ) Max = x ;
		if( x == 1 ) sol  = n - 1 ;
	}
	
	precalc();
	
	for( i = 1 ; i <= Max ; i++ )
		for( j = i ; j <= Max ; j += i )
			if( viz[j] ) v[i]++;
	
	P = 1 ; 

	back(1);
	
	printf("%lld",sol);
	
	return 0;
}