Cod sursa(job #25507)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 4 martie 2007 12:46:52
Problema Puteri Scor 40
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasa a 10-a Marime 1.03 kb
#include <stdio.h>

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

int nr[65][65][65];
int nr2[65][65][130];
int gcd[130][130];

inline int getgcd( int a, int b )
{
	if (b == 0) return a;
	if (a == 0) return b;

	int c;
	for (; a % b; )
	{
		c = a % b;
		a = b;
		b = c;
	}
	return b;
}

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(a,0,129) FOR(b,0,129)
		gcd[a][b] = getgcd(a, b);
	
	long long NR = 0;
	FOR(a,0,65) FOR(b,0,65) FOR(c,0,65)
	{
		if (!nr[a][b][c])
			continue;
		NR += (long long)nr[a][b][c] * (nr[a][b][c] - 1) >> 1;
		FOR(a2,a,65) FOR(b2,(a2 == a ? b : 0),65)
		{
			if (gcd[a + a2][b + b2] == 1)
				continue;

			FOR(c2,(a2 == a && b2 == b) ? c + 1 : 0,65)
			{
				if (gcd[ gcd[a + a2][b + b2] ][c + c2] == 1)
					continue;
				if (!nr[a2][b2][c2])
					continue;

				NR += (long long)nr[a][b][c] * nr[a2][b2][c2];
			}
		}
	}

	printf("%lld\n", NR);

	return 0;
}