Cod sursa(job #1344831)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 16 februarie 2015 23:50:28
Problema Pairs Scor 0
Compilator cpp Status done
Runda prega_rav_1 Marime 1.29 kb
#include <stdio.h>
#define inf 1000023
#define NMAX 100023
FILE *fin, *fout;
int n, temp = 1, div[57], size, val, rez, arr[57], nr;
void fp(int a)
{
	if(a%2 == 0)
	{
		div[size] = 2;
		size++;
		temp *= 2;
		while(a%2 == 0) a/=2;
	}
	for(int i = 3; i*i <= a && a> 1; i+=2)
	{
		if(a%i) continue;
		div[size] = i;
		size++;
		temp *= i;
		while(a%i == 0) a/=i;
	}
	if(a > 1)
	{
		div[size] = a;
		size++;
		temp *= a;
	}
}
bool check[inf];
int vef()
{
	int rez1 = 1, count = 0;
	for(int i = 1; i<= nr; i++) rez1 *= div[arr[i]-1];
	for(int i = 1; i <= inf; i++)
	{
		if(rez1*i >= inf) break;
		if(check[rez1*i]) count++;
	}
	return (count*(count-1))/2;
}
int comb(int len, int pos)
{
	int rez1 = 0;
	if(pos == len+1) return vef();
	for(int i = arr[pos-1]+1; i<=size; i++)
	{
		arr[pos] = i;
		rez1 += comb(len, pos+1);
	}
	return rez1;
}
int main()
{
	fin = freopen("pairs.in", "r", stdin);
	fout = freopen("pairs.out", "w", stdout);
	scanf("%d", &n);
	rez = (n*(n-1))/2;
	for(int i = 0; i< n; i++)
	{
		scanf("%d", &val);
		check[val] = 1;
		for(int j = 0; j< size; j++)
		{
			if(val%div[j]) continue;
			while(val%div[j] == 0) val/=div[j];
		}
		fp(val);
	}
	for(int i = 1; i<=size; i++)
	{
		nr = i;
		if(i%2) rez -= comb(i, 1);
		else rez+= comb(i, 1);
	}
	printf("%d\n", rez);
	fclose(fin);
	fclose(fout);
	return 0;
}