Cod sursa(job #442168)

Utilizator vladiiIonescu Vlad vladii Data 13 aprilie 2010 22:29:36
Problema Dreptunghiuri Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <math.h>
using namespace std;

int N, M, H, W;
long long sol, p;

int main() {
    FILE *f1=fopen("dreptunghiuri.in", "r"), *f2=fopen("dreptunghiuri.out", "w");
    int i, j, q, A, D;
    fscanf(f1, "%d %d", &M, &N);
    for(i=1; i<N; i++) {
         for(j=1; j<M; j++) {
              //aflu numarul de dreptunghiuri inscrise
              //intr-un dreptunghi mare de laturi H = i, W = j
              H = i; W = j; p = 1;
              for(A=1; A<H; A++) {
                   D=W*W - 4*A*(H - A);
                   if(D>=0) { q=(int)sqrt(D); }
                   if(D>=0 && q*q==D) {
                        if((W - q)%2==0 && ((W - q)>>1)>0 && ((W - q)>>1)<W) {
                             p++;
                        }
                        if((W + q)%2==0 && ((W + q)>>1)>0 && ((W + q)>>1)<W) {
                             p++;
                        }
                        if((W - q)%2==0 && (W + q)%2==0 && ((W - q)>>1)>0 && ((W + q)>>1)>0 && ((W - q)>>1)<W && ((W + q)>>1)<W && ((W - q)>>1)==((W + q)>>1)) {
                             p--;
                        }
                   }
              }
              p *= ((N-H)*(M-W));
              sol+=p;
         }
    }
    fprintf(f2, "%lld\n", sol);
    fclose(f1); fclose(f2);
    return 0;
}