题目链接:
题目大意:
题意:给出方程a(x1 ^ 2)+b(x2 ^ 2)+c(x3 ^ 2)+d(x4 ^ 2)=0的系数abcd,求共有多少组正整数解(x1, x2, x3, x4)。
a, b, c, d=[-50,50]
x1, x2, x3, x4=[-100,0)and(0, 100]
四重循环肯定T了。
因为平方有非负性,所以首先下面情况特判:
if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0)
{
printf("0\n");
continue;
}
我们把问题分开来:
a(x1 ^ 2)+b(x2 ^ 2) = -( c(x3 ^ 2)+d(x4 ^ 2) )
二重循环[1 , 100]求出所有hash = a(x1 ^ 2)+b(x2 ^ 2)的可能值。因为hash最大为 50 *10000 + 50*10000 =1000000,所以用vis标记。
再求[1 , 100] -( c(x3 ^ 2)+d(x4 ^ 2) )的和,与vis匹配就行了,时间复杂度O(n^2)
结果*16 因为每个x可以取得负号。 2^4=16。
#include <bits/stdc++.h>
using namespace std;
const int maxn=5000006;
int Hxz[1000010];
int Hxf[1000010];
int main()
{
int a, b, c, d;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
{
if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0)
{
printf("0\n");
continue;
}
memset(Hxz, 0, sizeof(Hxz));
memset(Hxf, 0, sizeof(Hxf));
int s=0;
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
int ans=a*i*i+b*j*j;
if(ans>=0)
{
Hxz[ans]++;
}
else
{
Hxf[-ans]++;
}
}
}
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
int ans=c*i*i+d*j*j;
if(ans>0)
{
s+=Hxf[ans];
}
else
{
s+=Hxz[-ans];
}
}
}
printf("%d\n",s*16);
}
return 0;
}