Equations-hdu1946-二分查找
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.
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.
InputThe input consists of several test cases. Each test case consists of a single line containing the 4 coefficients a, b, c, d, separated by one or more blanks.
End of file.OutputFor each test case, output a single line containing the number of the solutions.
Sample Input
1 2 3 -4 1 1 1 1
Sample Output
39088 0
题意:给出四个整数:a、b、c、d,问满足四元二次方程a*x1^2+b*x2^2+c*x3^2+d*x4^2=0的解有多少个?
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; LL sum[400007]; LL ans,k; void erfen(LL t) { int l=0,r=k; int mid; while(l<=r) { mid=(l+r)/2; if(sum[mid]==t) { ans++; for(int x=mid-1; x>=1&&sum[x]==t; x--)//如果mid左方的位置还有与t相等的数,ans+1 { if(sum[x]==t) ans++; } for(int x=mid+1; x<k&&sum[x]==t; x++)//如果mid右方的位置还有与t相等的数,ans+1 { if(sum[x]==t) ans++; } return; } else if(sum[mid]<t) l=mid+1; else r=mid-1; } } int main() { int a,b,c,d; while(~scanf("%d%d%d%d",&a,&b,&c,&d)) { k=0; if(a>0&&b>0&&c>0&&d>0)//剪枝 { printf("0\n"); continue; } for(int i=1; i<=100; i++) for(int j=1; j<=100; j++) sum[k++]=a*i*i+b*j*j; sort(sum,sum+k); ans=0; for(int i=1; i<=100; i++) for(int j=1; j<=100; j++) { LL t=-(c*i*i+d*j*j); erfen(t); } printf("%I64d\n",ans*16); } return 0; }