您的位置:首页 > 其它

POJ 1840.Eqs

2017-11-08 18:26 295 查看
题目:http://poj.org/problem?id=1840

AC代码(C++):

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>

#define INF 0xfffffff
#define MAXN 100005

using namespace std;

const int N = 1030305;
const int H = 1000007;

struct Node
{
int num;
int next;
};
Node node[N];
int cur;
int hashTable[H];
int a1,a2,a3,a4,a5;

void initHash()
{
cur = 0;
for (int i = 0; i < H; ++i) hashTable[i] = -1;
}

void insertHash(int num)
{
int h = abs(num)%H;
node[cur].num = num;
node[cur].next = hashTable[h];
hashTable[h] = cur;
cur++;
}

int main(){
initHash();
cin>>a1>>a2>>a3>>a4>>a5;
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 num = a1*i*i*i + a2*j*j*j + a3*k*k*k;
insertHash(num);
}
}
}

int ans = 0;
for(int i = -50; i <= 50; i++){
for(int j = -50; j <= 50; j++){
if(i==0||j==0)continue;
int num = (-a4)*i*i*i + (-a5)*j*j*j;
int next = hashTable[abs(num)%H];
while(next != -1){
if(node[next].num == num)ans++;
next = node[next].next;
}
}
}
cout<<ans;
}

总结: 对题目的表达式变形得到a1x13+ a2x23+ a3x33 = -a4x43 - a5x53, 于是问题转换成了数字哈希. 将左边表达式的和插入哈希表, 执行次数为100的3次方(如果暴力枚举则是100的5次方, 绝壁超时), 然后再用右边表达式的和来查表, 执行次数为100的2次方.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: