Eqs
题目链接 :http://poj.org/problem?id=1840
题目大意: 给出一个方程以及每个未知数的系数,求解的方案数。
题目思路: 与 hdu 1496 有点相同,但是这里的方程是 a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0,但这里的每个变量都属于[-50,50]且不等于0。不同的地方在于这里的x是三次幂,所以枚举要从-50到50,然后a1x13因为最大可能为50^4,所以在开hash数组的时候要如果用int定义会爆内存的,所以这里用short定义,毕竟每个值的情况数是很小的,short足够存下。然后就是将方程变化为 a1x13+ a2x23 = - (a3x33+ a4x43+ a5x53) ,这样先枚举x1,x2,得到hash数组,然后枚举x3,x4,x5去与hash数组比较得到方案数。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 6250005*2
using namespace std;
short f1[N],f2[N];
int main(){
int a,b,c,d,e;
while(scanf("%d%d%d%d%d",&a,&b,&c,&d,&e)!=EOF){
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
for(int i=-50;i<=50;i++){
for(int j=-50;j<=50;j++){
if(i==0||j==0) continue;
int t=a*i*i*i+b*j*j*j;
if(t>0){
f1[t]++;
}
else{
f2[-t]++;
}
}
}
int ans=0;
for(int i=-50;i<=50;i++){
for(int j=-50;j<=50;j++){
for(int k=-50;k<=50;k++){
if(i==0||j==0||k==0) continue;
int t=c*i*i*i+d*j*j*j+e*k*k*k;
if(t<=-N||t>=N) continue;
if(t>0) ans+=f2[t];
else ans+=f1[-t];
}
}
}
printf("%d\n",ans);
}
return 0;
}