https://vjudge.net/contest/280658#problem/D
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int p=(1<<15)-1;
struct str{
int v,c,n;
} a[1000010];
int h[p+10],tt;
void insert(int x){
int xx=(x%p+p)%p;
for (int i=h[xx]; i; i=a[i].n)
if (a[i].v==x)
{
a[i].c++;
return;
}
a[tt].v=x;
a[tt].c=1;
a[tt].n=h[xx];
h[xx]=tt++;
}
int searth(int x){
int xx=(x%p+p)%p;
for (int i=h[xx]; i; i=a[i].n)
if (a[i].v==x)
return a[i].c;
return 0;
}
int main()
{
int aa,b,c,d,ans;
while (~scanf("%d%d%d%d",&aa,&b,&c,&d))
{
if ((aa>0&&b>0&&c>0&&d>0)||(aa<0&&b<0&&c<0&&d<0))
{
printf("0\n");
continue;
}
ans=0;
tt=1;
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
for (int i=1; i<=100; i++)
for (int j=1; j<=100; j++)
insert(-i*i*aa-j*j*b);
for (int i=1; i<=100; i++)
for (int j=1; j<=100; j++)
ans+=searth(i*i*c+j*j*d);
printf("%d\n",ans*16);
}
}