poj 1186 哈希表构造

原创 2012年03月29日 20:45:17

思路:题目给定最多6元方程,每个解的范围给定了[1, 150],若n=6,直接枚举肯定超时 ,我们可以枚举出前三个解产生的值s1,存入表中。利用哈希表,由于x的取值范围是[1,150],三个解最多产生150*150*150种可能,这样就确定了哈希表的大小。再枚举后三个解产生的值s2,若s2 =s1,则说明这是一个解。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAX = 4000000;

bool used[MAX] = {0};
int ki[7], pi[7];
struct Hash{
    int val;
    int count;
};
Hash HashTable[MAX];
int n, m, ans, mid;

int getpow(int x, int p) {
    int tmp = 1;
    while (p) {
        if (p&1)
            tmp *= x;
        x *= x;
        p >>= 1;
    }
    return tmp;
}

int searchHash(int s) {
    int tmp;
    tmp = s;
    while (tmp < 0) tmp += MAX;
    while (tmp >= MAX) tmp -= MAX;
    while (used[tmp] && HashTable[tmp].val != s) {
        tmp++;
        if (tmp >= MAX)
            tmp -= MAX;
    }
    return tmp;
}

void insert(int s) {
    int pos = searchHash(s);
    HashTable[pos].val = s;
    used[pos] = 1;
    HashTable[pos].count++;
}

void leftHalf(int k, int s) {
    int i;
    if (k == mid) {
        insert(s);
        return;
    }
    for (i = 1; i <= m; ++i) {
        leftHalf(k+1,s+ ki[k]*getpow(i, pi[k]));
    }
}

void rightHalf(int k, int s) {
    int i, pos;
    if (k == n) {
        s = -s;
        pos = searchHash(s);
        if (HashTable[pos].val == s)
            ans += HashTable[pos].count;
        return;
    }
    for (i = 1; i <= m; ++i) {
        rightHalf(k+1,s+ki[k]*getpow(i, pi[k]));
    }
}

int main()
{
    scanf("%d", &n);
    scanf("%d", &m);
    int i;
    ans = 0;
    mid = n/2;
    for (i = 0; i < n; ++i)
        scanf("%d %d", &ki[i], &pi[i]);
    leftHalf(0, 0);
    rightHalf(mid, 0);
    printf("%d\n", ans);
    return 0;
}


poj 1186:方程的解数

题目描述如下:
  • just_young
  • just_young
  • 2014年09月25日 00:15
  • 465

poj 1186 方程的解数

方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 6393   Accept...
  • liu_fanyi3
  • liu_fanyi3
  • 2014年03月29日 10:53
  • 458

POJ 1186 hash 线性探测再散列

一直以来我都觉得线性探测再散列这个方法一定很低效 结果碰到今天这题之后我惊奇的发现 链表居然被线性探测再散列秒杀了 这个hash方法是将大数取模,放到一个位置上,如果这个位置被占用了,就往后移1格...
  • sdj222555
  • sdj222555
  • 2012年08月18日 14:19
  • 1132

POJ 1186 方程的解数

一道数据结构的水题。。。 题意为给予一个最多含六个未知数的方程k1*x1^p1+k2*x2^p2+k3*x3^p3+k4*x4^p4+k5*x5^p5+k6*x6^p6=0;求其整数解的个数。 其中x...
  • Vis_Stu
  • Vis_Stu
  • 2014年12月11日 08:48
  • 273

【浅谈折半搜索】POJ1186[方程的解数]题解

【浅谈折半搜索】POJ1186题解。
  • zzkksunboy
  • zzkksunboy
  • 2017年05月21日 21:39
  • 741

51Nod-1186-质数检测 V2

ACM模版描述题解伪随机素数检测,Miller-Rabin算法,如果用Java神马的有大数相关类型的话,就是一个模版题,套用一下这个算法模版就好了,然而如果用C++,那么这道题足够惨痛了,Miller...
  • f_zyj
  • f_zyj
  • 2016年08月13日 18:27
  • 696

poj 1186 方程的解数(线性探测再哈希)

方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 7084   Accept...
  • hexianhao
  • hexianhao
  • 2016年08月08日 09:52
  • 166

poj 1186 方程的解数 (hash+双向dfs)

Description 已知一个n元高次方程: 其中:x1, x2,...,xn是未知数,k1,k2,...,kn是系数,p1,p2,...pn是指数。且方程中的所有数均为整数。 假设...
  • xiaosshhaa
  • xiaosshhaa
  • 2017年02月23日 15:48
  • 172

poj 1186 方程的解数(HASH,DFS)

方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 7076   Accept...
  • acm_cxq
  • acm_cxq
  • 2016年08月04日 17:56
  • 240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1186 哈希表构造
举报原因:
原因补充:

(最多只允许输入30个字)