POJ 1840 Eqs

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


猜你喜欢

转载自blog.csdn.net/const_qiu/article/details/42478999
POJ