Cod sursa(job #1083430)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 15 ianuarie 2014 23:16:02
Problema Dreptunghiuri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <cmath>

#define e 0.000001

using namespace std;

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

int n,m,sum;
long long total;

bool aprox (double x)
{
    if (x-int(x) < e || int(x)+1-x < e)
        return 1;
    return 0;
}

int quadratic_eq (int x, int X, int Y)
{
    int sum = 0;
    double delta =  sqrt(4*x*x - 4*X*x + Y*Y);
                if (delta > e)
                {
                    double root = (Y+delta)/2;
                    if (aprox(root) && 0 <= root && root <= Y)
                    {
                        ++sum;
                    }

                    root = (Y-delta)/2;
                    if (aprox(root) && 0 <= root && root <= Y)
                    {
                        ++sum;
                    }
                }

                else if (fabs(delta) < e)
                {
                    if (Y%2==0)
                        ++sum;
                }
     return sum;
}

int main()
{
    fin>>n>>m;

    for (int X=1; X<n; ++X)
        for (int Y=1; Y<m; ++Y)
    {
        sum = 0;
        for (int x=1; x <= X/2; ++x)
            {
                sum += quadratic_eq (x,X,Y);
            }

        sum = sum*2 +1;

        if (X%2==0)
        {
            sum -= quadratic_eq(X/2,X,Y);
        }

        total += (n-X)*(m-Y)*sum;
    }

    fout<<total;
}