Cod sursa(job #1100506)

Utilizator Theorytheo .c Theory Data 6 februarie 2014 22:13:21
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.15 kb
#include <fstream>
#include <cmath>
using namespace std;

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

int N; int M;long long sol = 0; int sq[405 * 405];

int compute(int H, int W) {

    int count1 = 0;

    for(int A = 0 ; A < H; ++A) {

        //C ^ 2 - WC + A (H - A) = 0
        int delta = W * W - 4 * A * (H - A);

        if(delta < 0) continue;

        if(delta == 0) {
            count1 = count1 + (W % 2 == 0);
        } else {

            if(sq[delta] == 0) continue;

            int sol1 = (W + sq[delta]) / 2;
            int sol2 = (W - sq[delta]) / 2;

            if((W + sq[delta]) % 2 == 0 && 1 <= sol1 && sol1 <= W)
                count1++;
            if((W - sq[delta]) % 2 == 0 && 1 <= sol2 && sol2 <= W)
                count1++;
            }
        }

    return count1;
}

int main() {

    fin >> N >> M;
    --N; --M;

    for(int i = 1; i <= 400; ++i) sq[i * i] = i;

    for(int H = 1; H <= N; ++H)
        for(int W = 1 ; W <= M; ++W)
            sol = 0ll + sol + 1ll * compute(H, W) * (N - H + 1) * (M - W + 1);
    fout << sol <<'\n';
    return 0;
}