Cod sursa(job #5063)

Utilizator zombie_testeala bala portocala si mandarina zombie_teste Data 9 ianuarie 2007 22:07:29
Problema Dreptunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <string.h>
#define PT(X) (X) * (X)
#define NMAX 40//4

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*y;
         x2 = (B + sqr_t[Delta])/2*y;

         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 (Nr[A][B] == 0 && Nr[B][A] == 0)
               {
                   for (y = 0; y < A; y++)
                       Nr[A][B] += calculate(A, B, y);

                   Nr[B][A] = Nr[A][B];
               }

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

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

     return 0;
}