Cod sursa(job #630606)

Utilizator maritimCristian Lambru maritim Data 6 noiembrie 2011 00:23:21
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<fstream>
#include<math.h>
using namespace std;

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

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

void back0(int k,int i,int p)
{
	if(k == C[i][0]+1)
	{
		if(p <= MaxM)
			B[p] ++;
		return ;
	}
	back0(k+1,i,p);
	back0(k+1,i,1LL*p*C[i][k]);
}

void back(int k,int i,int p,int nr)
{
	if(k == C[i][0]+1)
	{
		if(p <= MaxM && p > 1)
			if(nr&1)
				sol += B[p]-1;
			else
				sol -= B[p]-1;
		return ;
	}
	back(k+1,i,p,nr);
	back(k+1,i,1LL*p*C[i][k],nr+1);
}

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

void memsetB(void)
{
	for(int i=1;i<=1000000;i++)
		B[i] = 1;	
}

int main()
{
	ifstream f("pairs.in");
	ofstream g("pairs.out");
	
	f >> N;
	ciur();
	memsetB();
	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];
		back0(1,i,1);
	}
	for(int i=1;i<=N;i++)
	{
		sol = 0;
		back(1,i,1,0);
		MAX += N-sol;
	}
	g << MAX/2;
	
	return 0;
}