ACM题解报告——HD1496

  hdoj上的1496题,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496

  此题的大意就是让你找出四元方程式a*x1^2+b*x2^2+c*x3^2+d*x4^2=0的解的种数并输出,其中a,b,c,d为常量,最开始的时候输入,他们的范围是[-50,0)&&(0,50],而变量x1、x2、x3、x4的范围是[-100,0)&&(0,100]。

  开始看到这道题我的思路就是进行暴力搜索,当时觉得应该会超时,后来果然超时了,没办法,只能想其它方式了。

   我们可以变化一下方程,写成a*x1^2+b*x2^2=-(c*x3^2+d*x4^2)。这样子的话我们就可以两边都进行搜索,最后找出相等的解即可。我使用了map数组下标来保存左边的结果,观察一下,发现当a、b、x1、x2都分别取最大或最小值时,map下标的变化范围是[-1000000,0)&&(0,1000000],为了保证map下标不小于0,可以选择在等式两边加上1000000,此时方程式变成了a*x1^2+b*x2^2+1000000=1000000-(c*x3^2+d*x4^2),最后用了一个sum值来统计他们的结果相同的个数。

代码如下:

#include<iostream>
using namespace std;
int map[2000008];
int ans,i,j,a,b,c,d,sum;
int main( )
{
while(cin>>a>>b>>c>>d)
{
  if((a>0&&b>0&&c>0&&d>0)||( a<0&&b<0&&c<0&&d<0))
  {
    cout<<"0"<<endl;
    continue;
  }
  sum=0;
  memset(map,0,sizeof( map));
  for(i=1;i<=100;i++)
    for(j=1;j<=100;j++)
{
  ans=a*i*i+b*j*j+1000000;
  map[ans]++;
 }
  for(i=1;i<=100;i++)
    for( j=1;j<=100;j++)
{
  ans=c*i*i+d*j*j;
  ans=1000000-ans;
  sum+=map[ans];
 }
  cout<<sum*16<<endl;

 }
  return 0;
}
View Code

 

posted @ 2013-05-28 16:17  paradise in hell  Views(219)  Comments(0Edit  收藏  举报