Cod sursa(job #109860)

Utilizator GiggityGlen Quagmire Giggity Data 25 noiembrie 2007 12:51:14
Problema Pairs Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 0.92 kb
#include<stdio.h>

#define NMAX 100000

int get(int x);

int p[7] = {2, 3, 5, 7, 11, 13, 17};
int N, V[NMAX], A[NMAX], D[2][1 << 7], U[1 << 7][1 << 7];

int main()
{
	int i, j, z, ok;
	long long rez = 0;

	freopen("pairs.in", "r", stdin);
	freopen("pairs.out", "w", stdout);

	scanf("%d", &N);

	for(i = 0; i < N; i++)
	{
		scanf("%d", V + i);
		A[i] = get(V[i]);
	}
	
	for(i = 0; i < (1 << 7); i++)
		for(j = 0; j < (1 << 7); j++)
		{
			for(z = 0; z < 7; z++)
				if((i & (1 << z)) && !(j & (1 << z)))
					z = 7;
			if(z == 7)
				U[i][j] = 1;
		}

	for(i = 0, ok = 1; i < N; i++, ok = !ok)
	for(j = 0; j < (1 << 7); j++)
	{
		D[ok][j] = D[!ok][j];
		if(U[A[i]][j]) D[ok][j]++;

		if(j == (A[i] ^ ((1 << 7) - 1)))
			rez += D[!ok][j];
	}
	printf("%d\n", rez);
	return 0;
}

int get(int x)
{
	int rez = 0;

	for(int i = 0; i < 7; i++)
		if((x % p[i]) == 0) rez |= 1 << i;

	return rez;
}