poj1840 Eqs(hash)

//题意:求解5元一次方程,问共有多少个解,注意所有的解不能为0

//思路:将5元转换为2元和3元,然后对2元所有解打表然后在3元中找匹配的解,本来思路是2元最多共有101*101种结果,因此也就是100201种键,按照这个思路开一个hash,不知道为什么总是丢解,最后想想本题是为了求的解的个数,那么其实主要的映射关系是多对一,也就是只需要将所有情况枚举出来的同时,对每种键所对应的解的个数++即可,也可以用取余的方式建立hash,但是此题可以得知方程和的最大值为50^4 + 50^4(系数和未知数最大都为50),而最小则为-(50^4 + 50^4),那么给枚举的数加上25000000则恰好可以全部枚举出来,见代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

short Hash[25000001];

int main()
{
    int a, b, c, d, e;
    while(cin >> a >> b >> c >> d >> e){
        memset(Hash, 0, sizeof(Hash));
        int sum;
        for(int i = -50; i <= 50; i++){
            if(!i) continue;
            for(int j = -50; j <= 50; j++){
                if(!j) continue;
                sum = a*i*i*i + b*j*j*j;
                if(sum < 0)
                    sum += 25000000;
                Hash[sum]++;
            }
        }
        int cnt = 0;
        for(int i = -50; i <= 50; i++){
            if(!i) continue;
            for(int j = -50; j <= 50; j++){
                if(!j) continue;
                for(int k = -50; k <= 50; k++){
                    if(!k) continue;
                    sum = c*i*i*i + d*j*j*j + e*k*k*k;
                    if(sum < 0)
                        sum += 25000000;
                    if(Hash[sum]){
                        cnt += Hash[sum];
                    }
                }
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/small__snail__5/article/details/80319837