poj 1186 方程的解数(线性探测再哈希)
Time Limit: 15000MS | Memory Limit: 128000K | |
Total Submissions: 7084 | Accepted: 2431 | |
Case Time Limit: 5000MS |
Description
其中:x1, x2,...,xn是未知数,k1,k2,...,kn是系数,p1,p2,...pn是指数。且方程中的所有数均为整数。
假设未知数1 <= xi <= M, i=1,,,n,求这个方程的整数解的个数。
1 <= n <= 6;1 <= M <= 150。
方程的整数解的个数小于231。
★本题中,指数Pi(i=1,2,...,n)均为正整数。
Input
Output
Sample Input
3 150 1 2 -1 2 1 2
Sample Output
178
解题思路:这道题直接暴搜肯定回TLE,这里用一点点技巧,把n分成两半,将左边的n/2个数的所有可能情况放入到哈希表中,那么在枚举右边n/2个数时可以直接通过哈希查询,这样可以很快的求解。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int MAX = 4000000;
struct Hash
{int val;int count;
}HashTable[MAX];
int n,m,ans;
int k[6],p[6];
bool used[MAX];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 = s;tmp = (tmp % MAX + MAX) % MAX;while(used[tmp] && HashTable[tmp].val != s){tmp++;tmp = (tmp % MAX + MAX) % MAX;}return tmp;
}void insert(int s)
{int pos = searchHash(s);HashTable[pos].val = s;HashTable[pos].count++;used[pos] = true;
}void leftHalf(int d,int s)
{if(d == n / 2){insert(s);return;}for(int i = 1; i <= m; i++)leftHalf(d+1,s + k[d] * getpow(i,p[d]));
}void rightHalf(int d,int s)
{if(d == n){s = -s;int pos = searchHash(s);if(HashTable[pos].val == s)ans += HashTable[pos].count;return;}for(int i = 1; i <= m; i++)rightHalf(d+1,s + k[d] * getpow(i,p[d]));
}int main()
{scanf("%d%d",&n,&m);for(int i = 0; i < n; i++)scanf("%d%d",&k[i],&p[i]);leftHalf(0,0);rightHalf(n/2,0);printf("%d\n",ans);return 0;
}
poj 1186 方程的解数(线性探测再哈希)相关推荐
- 哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现
哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 参考文章: (1)哈希查找解决地址冲突的两种最常见方法(线性探测再散列,链地址法)C++实现 (2)https://www. ...
- 散列表相关题目(线性探测再散列法)
散列表相关题目(线性探测再散列法) 一.题目 将关键字序列(7.8.30.11.18.9.14)散列存储到散列表中.散列表的存储空间是一个下标从0开始的一维数组,散列函数为H(key)=(key×3) ...
- Hash(散列)冲突解决之线性探测再散列和二次探测再散列
线性探测再散列 H(key) = key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入11 个关键字,16,74,60,43,54,90,46,31,29,88,77, ...
- Hash(散列)冲突解决 线性探测再散列和二次探测再散列
线性探测再散列 例如 哈希函数为: H(key) = key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入 11 个关键字,16,74,60,43,54,90,46 ...
- 【哈希冲突解决】线性探测再散列和二次探测再散列
定义 散列(Hashing)是计算机科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构( ...
- 【哈希表】线性探测再散列的相关知识与计算
注意概念: 装填因子 等概率下查找成功的平均查找长度 等概率下查找不成功的平均查找长度 线性探测再散列时以 存储空间的长度来取余 查找时比较次数,如在 {12}中查找12,12跟12也要进行一次比较. ...
- java描述线性探测_实现基于线性探测的哈希表1
课程资料链接:https://pan.baidu.com/s/1gQksMmhPR-2MwNjf6IdGHA 提取码:91gv 课程详细内容: 001.数据结构与算法概述1 002.数据结构与算法概述 ...
- 数据结构课程设计------c实现散列表(二次探测再哈希)电话簿(文件存储)
题目二 :散列表的设计与实现 2.1问题描述 设计散列表实现电话号码查找系统,使得平均查找长度不超过2 基本要求 (1)设每个记录有下列数据项:电话号码.用户名.地址: (2)从键盘输入各记录,以电话 ...
- 线性探测再散列法计算asl
再散列和平方散列不同,再散列是遇到冲突时前进一位. 计算查找失败的平均查找长度,要特别注意防止思维定式,在查找失败的情况下,既不是根据表中的元素个数,也不是根据表长来计算平均查找长度.查找失败时,在等 ...
最新文章
- python从入门到精通怎么样-Python从入门到精通:一个月就够了
- Windows和Linux双系统时间不对的问题。
- python win10 arm_windows10 arm版下载-windows10arm镜像64位中文版 - 极光下载站
- sublime php快捷键,sublime快捷键
- 拓端tecdat|Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- 记所内部“与顶级会议作者面对面”系列学术活动交流感受
- ConnectionString 最简便写法 for MSSQL 2005 EXPRESS
- 最全企业级数仓建设迭代版
- 复变函数 —— 2. 复函数的导数与复变函数的导数(柯西黎曼方程)的定义
- 高等数学(第七版)同济大学 习题5-2 个人解答
- 《出版专业实务·初级(2020版)》学习笔记
- 成功解决python.exe 无法找到入口 无法定位程序输入点
- 删除威金病毒残留的_desktop.ini文件(转贴)
- python 频谱图_SciPy spectrogram:计算频谱图
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十二节--小结,Bootstrap Table之角色管理
- 0ctf_2016_unserialize
- android qq音乐歌词怎么实现,歌词翻译利器 QQ音乐Android3.9.5版本全新上线
- 图像空间滤波总结(平滑空间滤波器及锐化空间滤波器)
- 一篇关于大黄蜂的鸡汤文的杂想
- ① Mysql- Create/表操作语句
热门文章
- MongoDB进阶-内嵌文档查询
- 理解 Dubbo 服务引用
- Unity-2017.2官方实例教程Roll-a-ball(一)
- Windows Phone 7应用之Tencent微博——封装API[上篇]
- 云管理成功的关键:应用工作流
- java使用JDBC连接数据库的几种方式
- [转]T4模版引擎之生成数据库实体类
- Ivan D Jankovic PhD Studentship** Application
- we need to have frequent contact for relationships for transferring from aca to career
- 我的第一篇学术论文发表出来啦啦啦啊!!!