Cod sursa(job #527593)
#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;
}