Cod sursa(job #547735)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 6 martie 2011 17:42:11
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <stdio.h>
#include <math.h>

int n, m, r[160005];
long long sol;

int main ()
{
	freopen ("dreptunghiuri.in", "r", stdin);
	freopen ("dreptunghiuri.out", "w", stdout);
	
	scanf ("%d %d", &n, &m);
	
	if (n < m)
		n ^= m ^= n ^= m;
	
	int i, j, k, nr, d;
	
	for (i = 1; i <= 160000; i ++)
		r[i] = sqrt (i);
	
	for (i = 2; i < n; i ++)
		for (j = 2; j < m; j ++)
		{
			nr = 0;
			for (k = 1; k < j; k ++)
			{
				d = i * i - 4 * k * (j - k);
				
				if (d < 0)
					continue;
				
				if (d == 0)
				{
					if (r[d] * r[d] != d)
						continue;
					nr += (i & 1) == 0;
					continue;
				}
				
				if (r[d] * r[d] != d)
					continue;
				d = r[d];
				
				if ((i ^ d) & 1)
					continue;
				if (d >= i)
					continue;
				nr += 2;
			}
			sol = sol + nr * (n - i) * (m - j);
		}
	
	sol = sol + (long long)n * (n - 1) / 2 * m * (m - 1) / 2;
	printf ("%lld\n", sol);
	
	return 0;
}