Cod sursa(job #2128782)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 februarie 2018 04:13:36
Problema Dreptunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 4e2;

int rad[MAXN * MAXN + 1];

int main()
{
    long long ans = 0LL;
    int n, m;
    ifstream fin("dreptunghiuri.in");
    fin >> n >> m;
    fin.close();
    for (int i = 1; i <= MAXN; ++i)
      rad[i * i] = i;
    for (int h = 1; h < n; ++h)
      for (int w = 1; w < m; ++w) {
        int loc_ans = 0;
        for (int lat = 1; lat <= h; ++lat) {
          int delta = w * w - 4 * lat * (h - lat);
          if (delta == 0 && w % 2 == 0 || delta > 0 && rad[delta] && (w + rad[delta]) % 2 == 0) {
            int sol1 = (w - rad[delta]) / 2, sol2 = (w + rad[delta]) / 2;
            if (sol1 > 0 && sol1 <= w || sol2 > 0 && sol2 <= w)
              ++loc_ans;
          }
        }
        ans += 1LL * loc_ans * (n - h) * (m - w);
      }
    ofstream fout("dreptunghiuri.out");
    fout << ans;
    fout.close();
    return 0;
}