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; }