Cod sursa(job #25970)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 4 martie 2007 17:03:54
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string.h>

#define FOR(i,a,b) for (int (i) = (a); i < (int)(b); i++)

long long NR;
int nr[65][65][65];
int nrp[65][65][65];
int prim[130];

int isprime( int k )
{
	if (k == 2)
		return 1;
	if (k % 2 == 0)
		return 0;
	int i;
	for (i = 3; i * i <= k; i += 2)
		if (k % i == 0)
			return 0;
	return 1;
}

inline int min( int a, int b )
{
	return (a < b) ? a : b;
}

int st[130];
void back( int k, int K, int P, int type )
{
	if (P > 128)
		return;
	if (k == K)
	{
		memset(nrp, 0, sizeof(nrp));
		FOR(a,0,65) FOR(b,0,65) FOR(c,0,65)
			nrp[a % P][b % P][c % P] += nr[a][b][c];
		long long NR2 = 0;
		FOR(a, 0, min(65, P) ) FOR(b, 0, min(65, P) ) FOR(c, 0, min(65, P) )
		{
			int a2, b2, c2;
			a2 = (P - a) % P; b2 = (P - b) % P; c2 = (P - c) % P;
			if (a2 > 64 || b2 > 64 || c2 > 64)
				continue;
		
			NR += type * (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
			NR2 += (long long)nrp[a][b][c] * (nrp[a2][b2][c2] - (a2 == a && b2 == b && c2 == c));
		}
		return;
	}
	int i = 1;
	if (k > 0) i = st[k - 1] + 1;
	for (; i <= prim[0]; i++)
		st[k] = i,
		back( k + 1, K, P * prim[i], type);
}

int main()
{
	freopen("puteri.in", "rt", stdin);
	freopen("puteri.out", "wt", stdout);
	int N;
	scanf("%d", &N);

	FOR(i,0,N)
	{
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);

		nr[a][b][c]++;
	}

	FOR(i,2,130)
		if (isprime( i ))
			prim[++prim[0]] = i;

	int P = 1;
	FOR(i,1,prim[0] + 1)
	{
		P *= prim[i];
		if (P > 128)
			break;
		if (i & 1)
			back(0, i, 1, 1);
		else
			back(0, i, 1, -1);
	}
	printf("%lld\n", NR >> 1);

	return 0;
}