POJ 1840 HASH

题目链接:http://poj.org/problem?id=1840

题意:公式a1x1^3+ a2x2^3+ a3x3^3+ a4x4^3+ a5x5^3=0,现在给定a1~a5,求有多少个(x1~x5)的组合使得公式成立。并且(x1~x5)取值再[-50,50]且不能为0

思路:因为x的值范围比较小,只有100.所以可以先求出 a1x1^3+a2x2^3+a3x3^3. 然后在求 (-1)*(a4x4^3+a5x5^3)从前面的所得的Hash表进行二分查找。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<time.h>
#include<map>
using namespace std;
typedef long long int LL;
const int MAXN=1000000+5;//100^3
int a,b,c,d,e;
int Hash[MAXN];
int main(){
#ifdef kirito
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    int start=clock();
    while(~scanf("%d%d%d%d%d",&a,&b,&c,&d,&e)){
        int cnt=0,ans=0;
        for(int i=-50;i<=50;i++){ //make a1x1^3+a2x2^3+a3x3^3
            if(i==0){continue;}
            for(int j=-50;j<=50;j++){
                if(j==0){continue;}
                for(int k=-50;k<=50;k++){
                    if(k==0){continue;}
                    int Sum=a*i*i*i+b*j*j*j+c*k*k*k;
                    Hash[cnt++]=Sum;
                }
            }
        }
        sort(Hash,Hash+cnt); //sorted
        for(int i=-50;i<=50;i++){ //make  (-1)*(a4x4^3+a5x5^3)
            if(i==0){continue;};
            for(int j=-50;j<=50;j++){
                if(j==0){continue;}
                int Sum=(-1)*(d*i*i*i+e*j*j*j);//the search number
                for(int k=lower_bound(Hash,Hash+cnt,Sum)-Hash;k<cnt;k++){//binary search the number
                    if(Hash[k]!=Sum){
                        break;
                    }
                    else{
                        ans++; 
                    }
                }
            }
        }
        printf("%d
",ans);
    }
#ifdef LOCAL_TIME
    cout << "[Finished in " << clock() - start << " ms]" << endl;
#endif
    return 0;
}
原文地址:https://www.cnblogs.com/kirito520/p/5659468.html