Cod sursa(job #630593)

Utilizator maritimCristian Lambru maritim Data 5 noiembrie 2011 22:44:31
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
#include<fstream>
#include<math.h>
using namespace std;

#define MaxN 100100
#define MaxP 13
#define MaxM 1000100

int N,a,B[MaxN],C[MaxN][MaxP],SUM,A[MaxM],MAX,V[MaxP],M[MaxN];

void Suma(int i,int l)
{
	int prod = 1,sum = 0,nr = 0,nr2 = 0;
	for(int j=1;j<=l;j++)
		if(V[j])
			prod *= C[i][j],sum += C[i][j], ++ nr;
	if(nr > 1)
	{
		for(int j=1;j<=N;j++)
			if(M[j] % prod == 0)
				++ nr2;
		if(nr % 2)
			SUM += nr2;
		else
			SUM -= nr2;
	}
	else
		SUM += A[sum];
}

void back(int i,int l,int k)
{
	if(k == l+1)
		Suma(i,l);
	else
		for(int j=0;j<=1;j++)
		{
			V[k] = j;
			back(i,l,k+1);
		}
}

int main()
{
	ifstream f("pairs.in");
	ofstream g("pairs.out");
	
	f >> N;
	for(int i=1;i<=N;i++)
	{
		f >> a;
		M[i] = a;
		double x = a;
		for(int j=2;a != 1 && j<=sqrt(x);j++)
			if(a%j == 0)
			{
				A[j] ++;
				C[i][++C[i][0]] = j;
				while(a%j == 0)
					a /= j;
			}
		if(a != 1)
			C[i][++C[i][0]] = a,A[a] ++;
	}
	for(int i=1;i<=N;i++)
	{
		SUM = 0;
		back(i,C[i][0],1);
		MAX += N-SUM;
	}
		
	g << MAX/2;
	
	return 0;
}