Cod sursa(job #2491746)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 13 noiembrie 2019 02:28:47
Problema Dreptunghiuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>

using namespace std;

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

const int NMax = 400;

long long Sol, N, M, Sqrt[NMax * NMax + 5];

int Count(int l, int L)
{
    int Ans = 0;

    for(int A = 1; A < l / 2; A++)
    {
        ///C^2 - LC + A(l - A) = 0
        int delta = L * L - 4 * A * (l - A);

        if(delta == 0 && (L % 2 == 0))
            Ans++;
        else if(delta > 0 && Sqrt[delta] != 0)
        {
            delta = Sqrt[delta];

            int c1 = (L + delta) / 2, c2 = (L - delta) / 2;

            if(0 < c1 && c1 < L && ((L + delta) % 2 == 0))
                Ans++;

            if(0 < c2 && c2 < L && ((L - delta) % 2 == 0))
                Ans++;
        }
    }
    Ans *= 2;

    if(l % 2 == 0)
    {
        int A = l / 2;
        int delta = L * L - 4 * A * (l - A);

        if(delta == 0 && (L % 2 == 0))
            Ans++;
        else if(delta > 0 && Sqrt[delta] != 0)
        {
            delta = Sqrt[delta];

            int c1 = (L + delta) / 2, c2 = (L - delta) / 2;

            if(0 < c1 && c1 < L && ((L + delta) % 2 == 0))
                Ans++;

            if(0 < c2 && c2 < L && ((L - delta) % 2 == 0))
                Ans++;
        }
    }
    return Ans + 1;
}

int main()
{
    fin >> N >> M;
    N--, M--;

    for(int i = 1; i <= N; i++)
        Sqrt[i * i] = i;

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++)
            Sol += Count(i, j) * (N - i + 1) * (M - j + 1);

    fout << Sol << '\n';

    fin.close();
    fout.close();

    return 0;
}