Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1496

此题可以用哈希数组求解,至于什么是哈希,可以先看以下这篇推荐文章,写得挺不错的。

推荐:http://www.cnblogs.com/yangecnu/p/Introduce-Hashtable.html#undefined

方法一:a*x1^2+b*x2^2+c*x3^2+d*x4^2=0

可以看作:a*x1^2+b*x2^2 = (c*x3^2+d*x4^2)*(-1)

其中:a,b的大小都在正负50之间,而x则为正负100之间(除了0)

那么左边的大小范围+-1000000,其实右边也一样。

那么就可以用两个hash数组,假设为hash1[], hash2[]

直接将计算结果作为key,那hash1[ key ] 不等于0 时,就代表左边可以计算出key这个值,

hash2[key]如果也不等于0,也就是右边也可以计算出这个值,即间接说明等式a*x1^2+b*x2^2+c*x3^2+d*x4^2=0成立

但此时key可能为负数,所以为了更好的与数组配合,两边同加上一个数字2000000,这样两边既能保持平衡,又能使任一边计算结果不为0

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;const int MAXN = 2000000;
int hash1[ MAXN+5];
int hash2[ MAXN+5];
const int CUR = 1000000;int main()
{int a, b, c, d;int i, j;int cases=0;while( scanf("%d%d%d%d", &a,&b,&c,&d)!=EOF ){// a,b,c,d都大于0或都小于0的情况可以直接得出结果为0if( a>0 && b>0 && c>0 && d>0 ){printf("0\n");continue;}if( a<0 && b<0 && c<0 && d<0 ){printf("0\n");continue;}// 数组初始化memset( hash1, 0, sizeof(hash1) );memset( hash2, 0, sizeof(hash2) );for( i=1;i<=100;i++ ){for( j=1;j<=100;j++ ){hash1[ i*i*a + j*j*b + CUR ]++;hash2[ CUR - i*i*c - j*j*d ]++;}}cases = 0;for( i=0;i<=MAXN+3;i++ )cases = cases + hash1[i] * hash2[i];printf( "%d\n", cases*16 );// 要乘以16 ,因为刚才计算时,x1,x2,x3,x4都只算了为正的情况,但这4个变量其实每个都可正可负的}
}

方法二:其实也差不多,但主要在空间的利用上,因为x1^2最多有100种情况, x2^2也最多有100种情况,那么每边最多有10000种情况,那么上一种方法对空间实在是太浪费了。所以构造一个好的哈希函数,能节省好多空间。

#include <iostream>
#include <cmath>
#include <cstdio>using namespace std;const int PRIME = 9973;
const int KEEP_POS_MAXN = 2000000;
const int ARRAY_MAXN = 10000;typedef struct Node{Node *next;int value;int times;Node(){times = 1;next = NULL;}
}Node;Node hash[ARRAY_MAXN];int GetKey( int value );
void InsertValue( int value );
Node *QueryValue( int value );
void FreeNode( Node * );int main() {int a, b, c, d;while( scanf( "%d%d%d%d", &a, &b, &c, &d )!=EOF ) {// a,b,c,d 都大于0或都小于0可以直接得出结果为0if( a>0 && b>0 && c>0 && d>0 ) {printf( "0\n" );continue;}if( a<0 && b<0 && c<0 && d<0 ) {printf( "0\n" );continue;}int x1, x2;for( x1=1; x1<=100; x1++ ) {for( x2=1;x2<=100;x2++ ) {InsertValue( a*x1*x1+b*x2*x2+KEEP_POS_MAXN );}}int x3, x4;int total = 0;Node *target = NULL;for( x3=1; x3<=100; x3++ ) {for( x4=1;x4<=100;x4++ ) {target = QueryValue( (c*x3*x3+d*x4*x4)*(-1)+KEEP_POS_MAXN );if( target != NULL ) {total += target->times;}}}printf( "%d\n", total*16 );    for( int i=0; i<ARRAY_MAXN; i++ ) {// 释放洁点空间的操作,不使用也能AC;但使用与不使用的空间使用情况差距会很大FreeNode( hash[i].next );hash[i].next = NULL;}}return 0;
}int GetKey( int value ) {return value % PRIME;
}void InsertValue( int value ) {int key = GetKey( value );Node *target = &hash[ key ];while( target->next != NULL ) {target = target->next;if( target->value == value ) {target->times ++;return ;}}Node *node = new Node;node->value = value;target -> next = node;return ;}Node *QueryValue( int value ) {int key = GetKey( value );Node *target = &hash[ key ];do{target = target->next;}while( target!=NULL && target->value!=value );return target;
}void FreeNode( Node *target ) {if( target!=NULL ) {FreeNode( target->next );delete target;}return ;
}

转载于:https://www.cnblogs.com/Emerald/p/4280496.html

Hdu 1496 Equations相关推荐

  1. hdu 1496 Equations(技巧hash)

    题意,给你a,b,c,d这4个数的值,然后问a*x1^2 + b*x2^2 +  c*x3^2 + d*x4^2 = 0 的(x1,x2,x3,x4)解一共有多少种?   初看这题,想直接4次循环找, ...

  2. Hdu 1496 Equations(巧妙哈希)

    题目链接 题目大意:给你一个方程:a*x1^2+b*x2^2+c*x3^2+d*x4^2=0,输入方程的4个系数,求出它的解的个数,其中系数 ai∈[-50,50]  xi∈[-100,0)∪(0,1 ...

  3. Equations HDU - 1496(哈希或三层for循环)求满足公式有多少种情况

    题意:求x在(-100<=x<=100)区间上,已知a,b,c,d,满足a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 的情况有多少种 思路:很明显四层for循环肯定超时,可用 ...

  4. hdu 1496 QQpet exploratory park 水概率dp

    题目 犯了个语言的错误: C语言中"%%"会输出一个"%" ,我在本地用1个"%"还是输出了"%". 代码: #incl ...

  5. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  6. word文档封面免费下载_为Word 2007文档添加封面

    word文档封面免费下载 I've been using Microsoft Word since 1985, starting with Word for Mac and eventually mo ...

  7. HDOJ1496 Equations【Hash】

    题目大意: 有一个等式, 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,1 ...

  8. HDU - 4569 Special equations(同余模定理)

    题目链接:点击查看 题目大意:给出多项式,现在给出多项式的每一项的系数,再给出模mod 现在问满足f(x)%(p*p)==0的最小x是多少 题目分析:我们可以知道,满足f(x)%(p*p)==0的x一 ...

  9. [转] HDU 题目分类

    转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...

最新文章

  1. shell与 .sh文件与 .bash文件
  2. Python进阶【第五篇】函数式编程及某些特殊函数
  3. WCF与现行分布式通讯技术性能对比
  4. Java程序员从笨鸟到菜鸟之(一百零六)java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.
  5. 1.svn无法连接,2.svn日志无法显示,3.日志无法修改
  6. 协程:Greenlet模块、Gevent模块
  7. aes 加密_Jmeter处理AES加密接口
  8. c语言网络在线人数统计,教你用ASP程序实现网站在线人数统计
  9. Excel日期格式在matlab中的转换
  10. Qt中使用QSqlDatabase::removeDatabase()的正确方法
  11. Java教程:Java continue语句详解
  12. 【leetcode】726. Number of Atoms
  13. FuelPHP 系列(三) ------ Model 模型
  14. js forEach跳出循环
  15. DDD领域驱动设计详解
  16. Cadence Allegro智能创建PCB封装库
  17. 介绍一些新手都能看的明白的基础破解教程
  18. Docker容器的capability
  19. mrc mcr 与 bic orr 含义及用法示例
  20. 十四、理解nn.module方法——学习python面向对象编程(一)

热门文章

  1. 华硕z170a如何开启m2_给Z170A 加个M.2 SSD,速度有点意思
  2. android 让应用恢复前台显示_Android程序由后台切换到前台
  3. 基于SSH2做一个24小时订单分析表格
  4. linux中网卡的流量怎么通过c语言获取_用Python获取计算机网卡信息
  5. 解决tab切换的时候,swiper不生效
  6. html 选中变颜色变化,如何防止HTML中的选项中的颜色变化以及选中的元素在html中被选中并失去焦点?...
  7. 计算机关于word试题及答案,职称计算机考试Word操作试题及答案
  8. android权限申请方法,安卓开发Android6+权限申请管理用户拒绝权限一键解决方案...
  9. php中不让数组初始化,javascript中数组与php数组初始化差异
  10. eclipse 2019-12版本安装svn