题目大意:

有一个等式,

a*x1^2+b*x2^2+c*x3^2+d*x4^2=0,

a、b、c、d是[-50,50]之间的非零整数,

有一组解析(x1,x2,x3,x4),其中xi是[-100,100]之间的非零整数,

求有多少组解满足上式;

输入:多组测试用例,每组测试用例包含4个数:a,b,c,d,他们之间用一个或多个空格隔开,EOF结尾;

输出:每组测试用例解的个数;

==========基本思路=========

4个循环嵌套,回溯;但是这样的复杂度是n^4,在本题中就是10000 0000数量级的~

==========改进思路=========

把两项移到右边,就变成了左边两项与右边两项相等的式子;

这样只要分别计算左右两边相等的可能性即可,这样的复杂度就是10000数量级了~

==========================

a*x1^2 最大是50*10000 = 500000,其他三项也是,同理,最小是-500000;

两项的最大就是1000000,最小就是-1000000,这样就需要一个2000000的hash表来存储了;

但是要注意的是,最后hash表中存储的解得个数并不是最后结果,因为a、b、c、d四项可以互换位置,所以最后要乘以2^4 = 16才是解的个数;

Problem : 1496 ( Equations )     Judge Status : Accepted
RunId : 7413352    Language : C    Author : qq1203456195
Code Render Status : Rendered By HDOJ C Code Render Version 0.01 Beta

#include <stdio.h>
#include <string.h>int arr[101];
int hash[2000003];
int main()
{int a,b,c,d;int i,j,sum;for (i=1;i<101;i++)    arr[i] = i*i;while (scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){if ((a>0 && b>0 && c>0 && d>0) ||(a<0 && b<0 && c<0 && d<0)){printf("0\n");continue;}memset(hash,0,sizeof(hash));for (i=1;i<=100;i++){for (j=1;j<=100;j++){hash[a*arr[i] + b*arr[j] + 1000000]++;}}sum = 0;for (i=1;i<=100;i++){for (j=1;j<=100;j++){sum += hash[-(c*arr[i] + d*arr[j]) + 1000000];}}printf("%d\n",sum<<4);}return 0;
}

=======再次改进=======

很明显,双重循环最多产生10000个数,所以开2000000个空间的数组明显是浪费了,怎样优化呢?1、数组,2、hash函数,3、冲突处理

开小数组是必须的,但是并不是越小越好,因为还要考虑冲突的现象,但是具体取多少的?HDUACM的课件中开的是50021,这是一个较大的素数,这样key的位置就可以通过比较常用的除模取余方法来确定了。其实hash函数以及处理冲突的方法有很多,没有固定的方法。

下边是HDUACM课件中使用的方法:

int hash(int k)
{int t=k%MAX;if(t<0)t+=MAX;while(f[t]!=0&&g[t]!=k)t=(t+1)%MAX;return t;
}

hash函数:t = k%MAX

处理冲突的方法:t = (t+1)%MAX

完整代码:f数组用来统计个数,g数组用来记录值;

// by laili
#include<stdio.h>
#include<memory.h>#define MAX 50021int f[MAX],g[MAX];int hash(int k)
{int t=k%MAX;if(t<0)t+=MAX;while(f[t]!=0&&g[t]!=k)t=(t+1)%MAX;return t;
}int main()
{int a,b,c,d,p,i,j,s,n,t[101];for(i=1;i<=100;i++)t[i]=i*i;while(scanf("%d%d%d%d",&a,&b,&c,&d)>0){……}
}

while中代码:

if(a>0&&b>0&&c>0&&d>0||a<0&&b<0&&c<0&&d<0){printf("0\n");continue;}memset(f,0,sizeof(f));n=0;for(i=1;i<=100;i++)for(j=1;j<=100;j++){s=a*t[i]+b*t[j];p=hash(s);g[p]=s;f[p]++;}for(i=1;i<=100;i++)for(j=1;j<=100;j++){s=-(c*t[i]+d*t[j]);p=hash(s);n+=f[p];}printf("%d\n",n*16);

本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/archive/2012/12/18/2824091.html,如需转载请自行联系原作者

HDOJ1496 Equations【Hash】相关推荐

  1. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  2. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  3. HDOJ1800 Flying to the Mars【Hash】

    题目大意: 8888年,地球被PPF王国统治了.由于人口增长,PPF需要为新生儿找寻更多的陆地.最后,PPF决定攻击通知Mars火星的Kscinow.问题来了,怎样让士兵到火星上去呢?PPF召集士兵征 ...

  4. P3370-[模板]字符串哈希【hash】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3370 大意 输出若干个字符串,求输入的字符串的总个数. 解题思路 ...

  5. jzoj3464-秀姿势【hash】

    正题 给出n个数,删去k种数,使一种数连续的最长. 解题思路 用hash表储存每种数在leftleftleft到iii这个区间内没种数的个数,然后如果这个区间内的种数超过k+1个那么就移动left&q ...

  6. 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)

    正题 luogu 1019 题目大意 给你若干个词语,让你把他们连起来(重复段叠在一起),每个词语最多用两次,问你该串最长是多少 解题思路 dfs枚举一个单词后面接哪个单词,然后枚举重叠长度,再用ha ...

  7. bzoj 2761: [JLOI2011]不重复数字【hash】

    map会T,双hash会冲突--于是非酋写了个三hash #include<iostream> #include<cstdio> #include<cstring> ...

  8. 【HASH】【UVA 10125】 Sumset

    传送门 Description 给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈S Input 多组数据,每组数据包括: 第一行一个整数n,代表元素个数 下面n行每行一个整 ...

  9. 【hash】兔子与兔子(C++)

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 376 Solved: 75 [Submit][Status][Web Board] Descripti ...

最新文章

  1. combobox绑定数据
  2. 后台运行神器screen
  3. android关键应用程序,安卓开发:Android应用程序的四个关键点
  4. Apache Camel 3.1 –更多骆驼核心优化(第3部分)
  5. 删除文件及文件夹命令
  6. Ubuntu下使用Atom将Markdown文件转换为PDF的一个异常
  7. (转)你确定你的交易系统最快?
  8. jquery ztree 设置勾选_zTree 勾选checkbox
  9. shell转化bat工具_shell脚本与bat转换
  10. 最新PP点点通V2008简体中文版免费下载
  11. 微信收款没有提示通知消息,怎么打开?解决方案
  12. java 热度算法_Raddit算法Java实现
  13. Hyper-v安装CentOS
  14. 金蝶K3 BOM独立控制跳层开关开发
  15. Revit: AR and VR Workflows Revit:AR和VR工作流程 Lynda课程中文字幕
  16. 贪心算法-磁带最优存储问题
  17. PCB治具设计、制造和管理
  18. C#实例练习3:程序流程控制(2)
  19. linux下交叉编译jrtplib-3.9.1
  20. linux sftp 命令_Linux Sftp命令示例

热门文章

  1. 春节前51Aspx源码发布详情
  2. scala初学之helloWorld
  3. 分治法在求解“最近对”问题中的应用(JAVA)
  4. FileInputStreamTest
  5. java输出变量_Java笔记1: 输入输出与变量常量
  6. python里else中文意思_Python循环语句中else的用法总结
  7. 开发黑名单功能demo_中台实践:通用化黑名单平台
  8. 服务器操作系统策略,服务器操作系统策略
  9. java jframe 设置背景图片_JFrame如何设置背景图片
  10. php的c方法,thinkphp的c方法的使用