Cod sursa(job #1142735)

Utilizator Ionut228Ionut Calofir Ionut228 Data 14 martie 2014 09:35:49
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream fin("dreptunghiuri.in");
ofstream fout("dreptunghiuri.out");

int N, M;
long long sol;
int rad[161604];

void precompute()
{
    for (int i = 1; i <= 400; ++i)
        rad[i * i] = i;
}

int solve(int H, int W)
{
    int nrd = 0;

    for (int A = 1; A <= H; ++A)
    {
        int delta = W * W - 4 * A * (H - A);

        if (delta < 0)
            continue;
        else if (delta == 0)
        {
            if (W % 2 == 0)
                ++nrd;
            continue;
        }
        else
        {
            delta = rad[delta];

            if (delta == 0)
                continue;

            if ((W + delta) % 2 == 0 && 1 <= (W + delta) / 2 && (W + delta) / 2 <= W)
                ++nrd;
            if ((W - delta) % 2 == 0 && 1 <= (W - delta) / 2 && (W - delta) / 2 <= W)
                ++nrd;
        }
    }

    return nrd;
}

int main()
{
    fin >> N >> M;
    --N;
    --M;
    precompute();

    sol = 0;
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= M; ++j)
            sol += 1LL * solve(i, j) * (N - i + 1) * (M - j + 1);

    fout << sol << '\n';

    fin.close();
    fout.close();
    return 0;
}