Cod sursa(job #119783)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 3 ianuarie 2008 10:16:37
Problema Pairs Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <vector>

using namespace std;

#define DBxG
#define FL

#define fin  "pairs.in"
#define fout "pairs.out"

const int Vmax = 1001100;
const int Nmax = 100100;

int N,MAX;
int nr[Nmax];
int divnr[10];
vector <int> v;

long long cnt1;	//cate is bune
long long cnt2;	//cate au cmmdc>1

//v[i]  - cate numere se divid cu i
//nr - numerele date
//div[i] - divizorii numarului nr[i]

void readdata()
{
	int i;

	freopen(fin,"r",stdin);

	scanf("%d",&N);

	for (i=1;i<=N;++i)
	{
		scanf("%d",&nr[i]);
		if ( nr[i] > MAX )
			MAX = nr[i];
	}

	++MAX;

	v.resize(MAX);

	for (i=1;i<=N;++i)
		v[ nr[i] ] = 1;
}

void afla(int a)
{
	int j,bun;

	divnr[0]=0;

	for (j=2;j*j<=a && a > 1;++j)
	{
		bun=0;
		while (a%j==0)
		{
			bun=1;
			a/=j;
		}	
		if (bun)
			divnr[++divnr[0]]=j;
	}

	if (a>1)
		divnr[++divnr[0]]=a;	
}

void go(int lev,int last,int prod)
{
	int i;

	if (lev>0)
	{
		if (lev%2!=0)
			cnt2+=(v[prod]-1);
		else
			cnt2-=(v[prod]-1);
	}

	if (lev==divnr[0])
		return ;

	for (i=last+1;i<=divnr[0];++i)
		go(lev+1,i,prod*divnr[i]);
}

void solve()
{
	int i,j;
	
//aflu fiecare numar "i" cu cate numere din "nr" se divide
	for (i=2;i<MAX;++i)
	for (j=i+i;j<MAX;j+=i)
		v[i]+=v[j];
//gata

#ifdef DBG
	for (i=1;i<MAX;++i)
		printf("%d ",v[i]);
	printf("\n");
#endif

	cnt1 = N-1;
	cnt1 = cnt1 * N;
	cnt1 = cnt1 / 2;

	cnt2 = 0;

//incep rezolvarea propriu-zisa

	for (i=1;i<=N;++i)
	{
		afla(nr[i]);
		go(0,0,1);	
	}

	cnt2/=2;

	cnt1-=cnt2;

#ifdef FL
	freopen(fout,"w",stdout);
#endif

	printf("%lld\n",cnt1);
}

int main()
{
	readdata();
	solve();
	return 0;
}