Cod sursa(job #131249)

Utilizator c_sebiSebastian Crisan c_sebi Data 3 februarie 2008 15:08:25
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream>
#define MAX 400

using namespace std;

int nl, nc;
int sqr[MAX*MAX+1];

void S(){
	int i;
	for(i=1; i<=MAX; i++)
		sqr[i*i]=i;
}

int solve(int h, int w, int a){
	int F=0;
	int d;
	int c1, c2;
	if(w*w-4*a*(h-a)==0)
		d=0;
	else if(w*w-4*a*(h-a)>0 && sqr[w*w-4*a*(h-a)])
		d = sqr[w*w-4*a*(h-a)];
	else d=-1;

	if(d>=0)		{
		c1=(w+d)/2;
		c2=(w-d)/2;

		if(c1==c2)
			if(w%2==0 && c1<w && c1>=0)
				F=1;
			else F=0;
		else {
			if((w+d)%2==0 && 0<=c1 && c1<w)
				F++;
			if((w-d)%2==0 && 0<=c2 && c2<w)
				F++;
		}
	}
	else F=0;
	return F;
}


int main(){
	int i, j, a;
	long long nr=0, SOL=0;
	ifstream f("dreptunghiuri.in");
	ofstream g("dreptunghiuri.out");
	f>>nl>>nc;
	S();
	if(nl>nc){
		i=nl; nl=nc; nc=i; }
	for(i=1; i<nl; i++) {
		for(j=i; j<nc; j++){
			for(nr=0, a=0; a<i; a++)
				nr += solve(i, j, a);
			if(i!=j){
				if(nl>i && nc>j) SOL += (nl-i)*(nc-j)*nr;
				if(nl>j && nc>i) SOL += (nl-j)*(nc-i)*nr;
			}
			else SOL+=(nl-i)*(nc-j)*nr;
		}
	}
	g<<SOL<<endl;
	f.close();
	g.close();
	return 0;
}