Equations
Time Limit: 3000 MS Memory Limit: 32768 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description
Consider equations having the following form:
a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.
It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.
Determine how many solutions satisfy the given equation.
Input
End of file.
Output
Sample Input
1 2 3 -4 1 1 1 1
Sample Output
39088 0
#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 1000000 //最大值
using namespace std;
int Hash1[maxn];
int Hash2[maxn];
int i,j,ans;
int main()
{
int a,b,c,d;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
{
memset(Hash1,0,sizeof(Hash1));
memset(Hash2,0,sizeof(Hash2));
if(a*b>0 && b*c>0 && c*d>0) //同号答案0;
{
printf("0\n");
continue;
}
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
int n = a*i*i+b*j*j;
if(n>0) Hash1[n]++; //用Hash1这个数组存正数;
else Hash2[-n]++; // 用Hash2来存负数,注意是 -n;
}
}
ans = 0;
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
int n = -c*i*i-d*j*j;
if(n>0) ans+=Hash1[n]; //当n大于0时,把代表为正的数组加起来;
else ans+=Hash2[-n]; //当n小于0时,把负值相加;
}
}
printf("%d\n",16*ans); //由于是平方,所以这4个值都有2种情况(不论 i 值正负 i*i 值都一样),所以要总数要乘16;
}
return 0;
}