Cod sursa(job #1150174)

Utilizator poptibiPop Tiberiu poptibi Data 22 martie 2014 17:23:37
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.02 kb
#include <cstdio>
#include <cstdlib>
using namespace std;

const int NMAX = 1010;

int N, M, Sqrt[NMAX * NMAX];
long long Ans;

int Count(int L1, int L2)
{
    int Ans = 1;
    for(int i = 1; i < L1; ++ i)
    {
        int Delta = L2 * L2 - 4 * i * (L1 - i);
        if(Delta == 0 && L2 % 2 == 0)
        {
            Ans ++;
            continue;
        }
        if(Delta <= 0 || Sqrt[Delta] == 0) continue;
        int Sol1 = L2 - Sqrt[Delta], Sol2 = L2 + Sqrt[Delta];
        if(2 <= Sol1 && Sol1 < 2 * L2 && Sol1 % 2 == 0) Ans ++;
        if(2 <= Sol2 && Sol2 < 2 * L2 && Sol2 % 2 == 0) Ans ++;
    }
    return Ans;
}

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

    for(int i = 1; i < NMAX; ++ i)
        Sqrt[i * i] = i;

    scanf("%i %i", &N, &M);
    for(int i = 2; i <= N; ++ i)
        for(int j = 2; j <= M; ++ j)
            Ans += 1LL * (N - i + 1) * (M - j + 1) * Count(i - 1, j - 1);

    printf("%lld\n", Ans);
}