Cod sursa(job #906221)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 6 martie 2013 16:56:55
Problema Dreptunghiuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#include <math.h>
using namespace std;

const int dim = 405*405*10;
int N, M, sqr[dim];
long long R;
 
void cit ()
{
    scanf ("%d%d", &N, &M);
	for (int i = 0; i < dim; i++)
		sqr[i] = -1;
	for (int i = 0; i * i < dim; i++)
		sqr[i * i] = i;
}
 
void pre ()
{
    int ix, iy, xs, delta, nr, sqi;
    double sq;
	
    for (ix = 1; ix <= N; ix++)
    {
        for (iy = 1; iy <= M; iy++)
        {
            nr = 1;
            for (xs = 1; xs < ix; xs++)
            {
                delta = iy * iy + 4 * xs * (xs - ix);
                if (delta <= 0)
                {
                    if (delta == 0)
                        nr++;
                    continue;
                }
                 
                sqi = sqr[delta];
                if (sqi == -1)
                    continue;
                 
                if (((iy + sqi) & 1) == 0)
                    nr++;
                if (((iy - sqi) & 1) == 0)
                    nr++;
            }
             
            if (ix < N && iy < M)
                R += nr * (N - ix) * (M - iy);
            /*
            if (ix <= M && iy <= N)
                R += nr * (M - ix + 1) * (N - iy + 1);
            */
        }
    }
}
 
void afi ()
{
    printf ("%lld", R);
}
 
int main ()
{
    freopen ("dreptunghiuri.in", "r", stdin);
    freopen ("dreptunghiuri.out", "w", stdout);
     
    cit ();
    pre ();
    afi ();
     
    return 0;
}