Cod sursa(job #906370)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 6 martie 2013 19:36:40
Problema Dreptunghiuri Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<fstream>

using namespace std;

#define max_n 410

ifstream f("dreptunghiuri.in");
ofstream g("dreptunghiuri.out");

int i , j , n , m , sol ;
int rad[max_n*max_n+10];


void initializare(){
	
	for(int i = 1 ; i <= max_n*max_n ; i++)
		rad[i] = -1;
	for(int i = 0 ; i <= max_n ; i++)
		rad[ i*i ] = i;
	
}

int nr_dr(int L , int H){
	
	L--; H--;
	
	int nr = 1 , delta;
	int sol1 , sol2;
	
	for(int A = 1 ; A < H ; A++){
		
		delta = L*L - 4*A*(H-A);
		
		if(delta == 0 && L%2==0 ){
			nr++;
			continue;
		}
		if(delta < 0)
			continue;
		
		delta = rad[delta];
		
		if(delta == -1)
			continue;
		
		sol1 = L + delta;
		sol2 = L - delta;
		
		if( sol1%2 == 0 ){
			sol1 /= 2;
			
			if(0<sol1 && sol1<L)
				nr++;
		}
		
		if( sol2%2 == 0 ){
			sol2 /= 2;
			
			if( 0<sol2 && sol2<L )
				nr++;
		}
		
	}
	
	return nr;
	
}

int main(){
	
	f>>n>>m;
	
	initializare();
	
	for( i = 2; i <= n ; i++ )
		for( j = 2 ; j <= m ; j++ ){
			
			sol += nr_dr( i , j )*( n-i+1 )*( m-j+1 );
			
		}
	
	g<<sol;
	
	return 0;
}