Cod sursa(job #5056)

Utilizator zombie_testeala bala portocala si mandarina zombie_teste Data 9 ianuarie 2007 21:47:35
Problema Dreptunghiuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <string.h>
#define PT(X) (X) * (X)
#define NMAX 512

int Nr[NMAX][NMAX];
int sqr_t[NMAX * NMAX];
int N, M, A, B, y;
long long Sol;

void process()
{
     int i;

     for (i = 1; i <= NMAX - 1; i++) sqr_t[i * i] = i;
}

int calculate(int A, int B, int y)
{
     int x1, x2;
     int Delta = PT(B) - 4 * y * (A - y);

     if (Delta < 0) return 0;

     if (sqr_t[Delta] || Delta == 0)
     {
         x1 = (B - sqr_t[Delta])/2;
         x2 = (B + sqr_t[Delta])/2;

         if (x1 == x2)  return (0 <= x1 && x1 < B);
         else           return (0 <= x1 && x1 < B) + (0 <= x2 && x2 < B);
     }

     return 0;
}

int main()
{
     freopen("dreptunghiuri.in", "r", stdin);
     freopen("dreptunghiuri.out", "w", stdout);

     process();

     scanf("%d %d", &N, &M); N--; M--;

     for (A = 1; A <= N; A++)
         for (B = 1; B <= M; B++)
         {
               if (A <= B || A > M)
               {
                   for (y = 0; y < A; y++)
                       Nr[A][B] += calculate(A, B, y);
               }
               else Nr[A][B] = Nr[B][A];

               Sol += (long long) Nr[A][B] * (N - A + 1) * (M - B + 1);
         }

     printf("%lld\n", Sol);

     return 0;
}