Cod sursa(job #4844)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 8 ianuarie 2007 12:42:00
Problema Dreptunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int NMAX = 401;
const int NMAX2 = NMAX * NMAX;

int N, M;
int SQ[NMAX2];
long long cnt;

void read() {
	FILE *fin = fopen("dreptunghiuri.in", "rt");

	fscanf(fin, " %d %d", &N, &M);

	if (M > N) swap(N, M);

	fclose(fin);
}

void prepare() {
	int i;
	
	memset(SQ, 0xff, sizeof(SQ));

	for (i = 0; i < NMAX; ++i)
		SQ[i * i] = i;

}

void count() {
	int i, j, k;
	int c, d;
	bool ok;

	for (i = 1; i < N; ++i)
		for (j = 1; j < M; ++j)
			for (k = 0; k < i; ++k) {
				ok = true;
				
				c = k * (i * k);

				if (c % j) ok = false;

				d = -1;
				if (c / j < NMAX2) 
					d = SQ[c / j];

				if (d < 0 || d >= j) ok = false;

				if (ok)
					cnt += (N - i) * (M - j);
				
//				printf("%d %d %d %lld\n", i, j, k, cnt);
			}

}

void afisare() {
	FILE *fout = fopen("dreptunghiuri.out", "wt");

	fprintf(fout, "%lld\n", cnt);

	fclose(fout);
}

int main() {

	read();

	prepare();

	count();

	afisare();

	return 0;
}