Cod sursa(job #630598)

Utilizator maritimCristian Lambru maritim Data 5 noiembrie 2011 23:11:36
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 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],Prim[MaxM],PrimV[MaxM];

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

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);
		}
}

void ciur(void)
{
	for(int i=2;i<=1000000;i++)
		if(PrimV[i] == 0)
		{
			Prim[++Prim[0]] = i;
			for(int j=i+i;j<=1000000;j+=i)
				PrimV[j] = 1;
		}
}

int main()
{
	ifstream f("pairs.in");
	ofstream g("pairs.out");
	
	f >> N;
	ciur();
	for(int i=1;i<=N;i++)
	{
		f >> a;
		M[i] = a;
		for(int j=1;Prim[j] <= a;j++)
			if(a%Prim[j] == 0)
				C[i][++C[i][0]] = Prim[j];
	}
	for(int i=1;i<=N;i++)
	{
		SUM = 0;
		back(i,C[i][0],1);
		MAX += i-SUM;
	}
		
	g << MAX;
	
	return 0;
}