Cod sursa(job #1894353)

Utilizator FloareaCucura Floarea Ludovica Floarea Data 26 februarie 2017 19:30:14
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda becreative23 Marime 1.17 kb
#include <fstream>

using namespace std;

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

const int NMax = 410, MMax = 410;
int n, m;
long long ans;
int rad[NMax * NMax];

long long Solve(const int &H, const int &W)
{
    long long ret = 1;
    for (int A = 1; A < H; ++ A)
    {
        int delta = W * W - 4 * 1 * A * (H - A) ;
        if (delta == 0)
        {
            int C = W / 2;
            if ((W & 1) == 0 && 1 <= C && C <= W)
                ++ret;
        }
        if (delta < 0 || rad[delta] == 0)
            continue;
        int C1 = (W + rad[delta]) / 2;
        int C2 = (W - rad[delta]) / 2;
        if (((W + rad[delta]) & 1) == 0)
        {
            if (1 <= C1 && C1 <= W)
                ++ret;
            if (1 <= C2 && C2 <= W)
                ++ret;
        }
    }
    return ret;
}

int main()
{
    fin>>n>>m;
    for (int i = 1; i <= m; ++ i)
        rad[i * i] = i;
    fin.close();
    for (int i = 2; i <= n; ++ i)
        for (int j = 2; j <= m; ++ j)
            ans += Solve(i - 1, j - 1) * (n - i + 1) * (m - j + 1);

    fout<<ans<<"\n";
    fout.close();
    return 0;
}