Cod sursa(job #122356)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 11 ianuarie 2008 21:26:24
Problema Puteri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 100010;

struct putere {
	char a, b, c;
} v[N_MAX];

int nr[130][130][130];

char step[130][130][130];

int kkt[] = {2,3,5,6,7,10,11,13,14,15,17,19,21,22,23,26,29,30,31,33,34,35,37,38,39,41,42,43,46,47,51,53,55,57,58,59,61,62,65,66,67,69,70,71,73,74,77,78,79,
82,83,85,86,87,89,91,93,94,95,97,101,102,103,105,106,107,109,110,111,113,114,115,118,119,122,123,127};

int kkt2[] = {0,0,0,2,0,2,0,0,2,2,0,0,2,2,0,2,0,3,0,2,2,2,0,2,2,0,3,0,2,0,2,0,2,2,2,0,0,2,2,3,0,2,3,0,0,2,2,3,0,2,0,2,2,2,0,2,2,2,2,0,0,3,0,3,2,0,0,3,2,0,3,
2,2,2,2,2,0};

int is[130];

int main()
{
	freopen("puteri.in", "r", stdin);
#ifndef _SCREEN_
	freopen("puteri.out", "w", stdout);
#endif

	int N, i, j;
	scanf("%d\n", &N);
	for (i = 1; i <= N; i ++) scanf("%d %d %d\n", &v[i].a, &v[i].b, &v[i].c);

	int nrdiv, fin = 0, rez, x, y, z, stp = 1, p;

	for (p = 0; p < 77; p ++) {
		nrdiv = kkt2[p];
		i = kkt[p];

		if (nrdiv == 0) nrdiv ++;
		
		for (j = 1; j <= N; j ++) {
			x = v[j].a % i, y = v[j].b % i, z = v[j].c % i;
			if (step[x][y][z] < stp) {
				step[x][y][z] = stp;
				nr[x][y][z] = 1;
			} else nr[x][y][z] ++;
		}

		rez = 0;
		for (j = 1; j <= N; j ++) {
			x = v[j].a % i, y = v[j].b % i, z = v[j].c % i;

			if (nr[x][y][z]) {

				if ((2 * x) % i == 0 && (2 * y) % i == 0 && (2 * z) % i == 0) {
					rez += nr[x][y][z] * (nr[x][y][z] - 1) / 2;
				} else rez += nr[x][y][z] * nr[(i - x) % i][(i - y) % i][(i - z) % i];
	
				nr[x][y][z] = 0;
				nr[(i - x) % i][(i - y) % i][(i - z) % i] = 0;
			}
		}

		if (nrdiv % 2 == 1) fin += rez;
		else fin -= rez;

		stp ++;
	}

	printf("%d\n", fin);

	return 0;
}