Cod sursa(job #186963)

Utilizator stef2nStefan Istrate stef2n Data 29 aprilie 2008 14:53:52
Problema Dreptunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
using namespace std;

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

int M, N, cnt = 0;
int sqrt[1 << 20];

int cnt_sol(const int &H, const int &W) {
    int sol = 1, C1, C2;
    for(int A = 2; A < H; ++A) {
        int delta = W * W - 4 * A * (H - A);
        if(delta < 0 || (delta > 0 && !sqrt[delta]))
            continue;
        if(!delta)
            sol += (W / 2 > 1 && W % 2 == 0);
        else {
            C1 = W + sqrt[delta];
            C2 = W - sqrt[delta];
            sol += (C1 / 2 > 1 && C1 / 2 < W && (C1 % 2 == 0)) + (C2 / 2 > 1 && C2 / 2 < W && (C2 % 2 == 0));
        }
    }
    return sol;
}

void solve() {
    for(int i = 1; i <= 1000; ++i)
        sqrt[i * i] = i;
    for(int i = 2; i <= M; ++i)
        for(int j = 2; j <= N; ++j)
            cnt += (M - i + 1) * (N - j + 1) * cnt_sol(i, j);
}


int main() {
    in >> M >> N;
    solve();
    out << cnt;
    return 0;
}