Cod sursa(job #1110100)

Utilizator apopeid14Apopei Daniel apopeid14 Data 17 februarie 2014 20:35:48
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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;
}