Cod sursa(job #527593)

Utilizator suzanicaSuzanica Mihu suzanica Data 31 ianuarie 2011 22:03:40
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <math.h>
#define filein "triang.in"
#define fileout "triang.out"
#define MAXN 3333
#define eps 1e-5

long int div[MAXN], a, rt, i, j, ndiv, ntri;
long double a2, d1, d2, b, c;

int main()
{
freopen(filein, "r", stdin);
freopen(fileout, "w", stdout);

scanf("%ld", &a);

rt = (long int) sqrt(a);
for (ndiv = 0, i = 1; i <= rt; i++)
  if (a % i == 0)
    {
      ndiv++;
      div[ndiv] = i;

      j = a/i;

      if (j != i)
        {
          ndiv++;
          div[ndiv] = j;
        }
    }

a2 = a;
a2 *= a;
ntri = 0;

/* !!!

   a trebuie descompus in factori primi si se genereaza toate combinatiile de factori
   primi, cu puteri intre 0 si 2*P, unde P este puterea la care apare fiecare factor
   in descompunerea lui a
  
   !!!
*/

for (i = 1; i <= ndiv; i++)
  for (j = i; j <= ndiv; j++)
    {
      /* 
         !!! ar trebui ca fiecare d1 sa fie generat o singura data !!! 
          -> trebuie sa se foloseasca descompunerea in factori primi, nu
          2 FOR-uri printre divizorii lui a
      */

      d1 = div[i];
      d1 *= div[j];
      d2 = a2/d1;

      b = d2 - d1;
      if (fabsl(floorl(b / 2.0) - b/2.0) < eps && b > 0)
        {
          b /= 2.0;
          c = d2 - b;

          if ((c > b || fabsl(c-b) < eps) && (b > a || fabsl(b-a) < eps))
            {
	      /*
              printf("%ld %.0Lf %.0Lf\n", a, b, c);
              */
	      ntri++;
            }
        }

    }

printf("%ld\n", ntri);

return 0;
}