POJ1840: Eqs(hash问题)
一道典型的hash问题:
已知a1,a2,a3,a4,a5,求有多少种不同的<x1,x2,x3,x4,x5>组合满足等式:
a1*x1^3 + a2*x2^3 + a3*x3^3 + a4*x4^3 + a5*x5^3 = 0
一种做法是暴力枚举,但因为xi∈[-50,-1)(1,50],所以暴力枚举时间为O(100^5),显然不可行。
所以只能用hash方法:
我们可以讲前两项 a1*x1^3 + a2*x2^3 的所有可能多项式结果SUM运算出来,并将这些SUM映射到hash表上。因为可能存在不同的<x1,x2>元组,但他们的SUM相同,会映射到hash表上相同的indice上,对于这种情况,我们采用hash[<x1,x2>::SUM]++的处理方式,最终hash表上所有indice上hash值不为0的值相加就是前两项所有可能的SUM。同时,因为存在运算结果为负值的情况,(因为ai, xi都∈[-50,-1)(1,50],所以前两项的SUM∈[-12500000,12500000]。为了不让映射的下标为负数,当SUM>=0时,KEY=SUM;当SUM<0时,KEY=SUM+12500000. 同时为了保证所有可能的SUM都能够hash到表上的indice,hash数组的规模需开到25000001.
--------------------------------------------------------------------------------------
然后我们继续枚举下面三项a3*x3^3 + a4*x4^3 + a5*x5^3 的所有可能SUM并求出KEY,
KEY一样采用上面的做法:当SUM>=0时,KEY=SUM;当SUM<0时,KEY=SUM+12500000.
当我们用(-KEY)去查hash表时,如果hash[0-KEY]>0,说明hash表上有记录,也意味着当前枚举的三元组<x3,x4,x5>找到了一个<x1,x2>使得整体的SUM=0,即找到一个方程的解。统计解的个数即为最终结果。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
const int max_size=;
short hsh[max_size];
int a1,a2,a3,a4,a5,ans;
int main(){
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
ans=;
memset(hsh,,sizeof(hsh));
for(int i=-;i<=;i++){
if(!i) continue;
for(int j=-;j<=;j++){
if(!j) continue;
int sum=;
for(int k=-;k<=;k++){
if(!k) continue;
sum=(-)*(i*i*i*a1+j*j*j*a2+k*k*k*a3);
if(sum<) sum+=max_size;
hsh[sum]++;
}
}
}
for(int i=-;i<=;i++){
if(!i) continue;
int sum=;
for(int j=-;j<=;j++){
if(!j) continue;
sum=i*i*i*a4+j*j*j*a5;
if(sum<) sum+=max_size;
if(hsh[sum]) ans+=hsh[sum];
}
}
printf("%d\n",ans);
}
POJ1840: Eqs(hash问题)的更多相关文章
- poj1840 Eqs(hash+折半枚举)
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...
- POJ1840 Eqs
题意描述 Eqs 求一个五元方程 \(a_1x_1^3+a_2x_2^3+a_3x_3^3+a_4x_4^3+a_5x_5^3=0\) 的解的个数. 题中给出 \(a_i\) 的值并且保证 \(-50 ...
- POJ 1840 Eqs(hash)
题意 输入a1,a2,a3,a4,a5 求有多少种不同的x1,x2,x3,x4,x5序列使得等式成立 a,x取值在-50到50之间 直接暴力的话肯定会超时的 100的五次方 10e了都 ...
- POJ 1840 Eqs 二分+map/hash
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...
- poj 1840 Eqs (hash)
题目:http://poj.org/problem?id=1840 题解:http://blog.csdn.net/lyy289065406/article/details/6647387 小优姐讲的 ...
- POJ1840 hash
POJ1840 问题重述: 给定系数a1,a2, ..,a5,求满足a1 * x1 ^ 3 + a2 * x2 ^ 3 +... + a5 * x5 ^ 3 = 0的 xi 的组数.其中ai, xi都 ...
- Eqs - poj 1840(hash)
题意:对于方程:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,有xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 现在给出a1,a2,a3, ...
- Eqs(枚举+ hash)
http://poj.org/problem?id=1840 题意:给出系数a1,a2,a3,a4,a5,求满足方程的解有多少组. 思路:有a1x13+ a2x23+ a3x33+ a4x43+ a5 ...
- POJ 1840 Eqs
Eqs Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 15010 Accepted: 7366 Description ...
随机推荐
- 【WPF】路由事件
总结WPF中的路由事件,我将学到的内容分为四部分来逐渐掌握 第一部分:wpf中内置的路由事件 以Button的Click事件来说明内置路由事件的使用 XAML代码: <Window x:Clas ...
- SQL中子查询为聚合函数时的优化
测试数据:create table test1 as select * from dba_objects where rownum<=10000;--10000条记录create table t ...
- MVC-列表页操作按钮调用脚本
如上图所示功能:点击右边的“编辑”和“重置按钮”,调用js实现弹出框功能. 1.写脚本: <script type="text/javascript"> functio ...
- dvd的舞女
[题目描述] 众所周知,dvd是一个爱做梦的好孩子. 但是不知道为什么最近dvd总是梦到一群舞女 众所周知,dvd是一个爱琢磨的好孩子. 但是不知道为什么dvd最近一直想不明白为什么 终于dvd发现了 ...
- webView 加载本地文件 - html/htm pdf docx tx
- (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; NSString *path = [[NSBundle mainBundle] p ...
- 移动js
http://blog.sina.com.cn/s/blog_6553196001015672.html http://blog.sina.com.cn/s/blog_6553196001014vjb ...
- List中toArray()的使用方法
当我们需要把一个链表中的元素放入数组时,jdk给我们提供了一种方法,也即运用toArray(),方法的使用如下: public class Test { public static void main ...
- easyui源码翻译1.32--SearchBox(搜索框)
前言 使用$.fn.searchbox.defaults重写默认值对象.下载该插件翻译源码 搜索框提示用户需要输入搜索的值.它可以结合一个菜单,允许用户选择不同的搜索类别.在用户按下回车键或点击组件右 ...
- 定时显示提示控件 TToolTip
转载过来的,文章出自: http://www.delphifans.com/infoview/Article_3640.html { 修改者:ghs 日期:20071218 功能:在 ...
- 错误信息:A TCP error (10013: 以一种访问权限不允许的方式做了一个访问套接字的尝试。) occurred while listening on IP Endpoint=192.168.1.18:8002.
百度之后,知道这个原因是端口已经被其他进程打开了 使用cmd命令,查看8002端口被哪一个程序占用了 C:\Windows\System32>netstat -ano | find " ...