Cod sursa(job #470523)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 14 iulie 2010 14:17:26
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cstring>
#include <cmath>

#define file_in "pairs.in"
#define file_out "pairs.out"

#define Max 1000
#define nmax 101000

int n,v[nmax];
long long x[nmax];
int q[nmax];
int w[100];

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	int i;
	scanf("%d", &n);
	for (i=1;i<=n;++i)
		 scanf("%d", &v[i]);
}


int prim(int X)
{
	int i,rad=(int)(sqrt(X)); 
	for (i=2;i<=rad;++i)
		 if (X%i==0)
			  return 0;
		return 1;
}		

void solve()
{
	int i,j,k,e,nrr,prod,nr,nrd=0;
    for (i=2;i<=Max;++i)
		 if (prim(i))
			  q[++nrd]=i;
	long long sol=0;	 
	for (i=1;i<=n;++i)	 
	{
		e=0;
		for (j=1;j<=nrd;++j)
			 if (v[i]%q[j]==0)
			 {
				 w[++e]=q[j];
				 while(v[i]%q[j]==0)
					  v[i]/=q[j];
			 }
		if (v[i]>1)
         w[++e]=v[i];
		sol+=(i-1);
		for (k=1;k<(1<<e);++k) 
		{
			prod=1;
			nrr=0;
			for (j=1;j<=e;++j)
				 if (k&(1<<(j-1)))
				 {
					 prod*=w[j];
					 nrr++;
				 }
			if (nrr&1)
        		sol-=x[prod];
			else
				sol+=x[prod];
		}
		for (k=1;k<(1<<e);++k) 
		{
			prod=1;
			
			for (j=1;j<=e;++j)
				 if (k&(1<<(j-1)))
				 {
					 prod*=w[j];
				
				 }
		        x[prod]++;
		}
	}
	
	printf("%lld", sol);
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}