hdu 1496 Equations(很巧的hash)

如果写成四重循环的程序,肯定会超时。这道题目给了我们 a,b,c,d 四个系数,而未知数却又四个,因此常规得暴力枚举写法会有四重循环。hash的处理即使将四个未知数拆成两部分,进行hash ,将两个未知数通过二维数组下标映射到一个唯一物理内存,这片区域即是一半方程式的值,此时只要做一个减法就可了,a+ b= 0, 得到 b= 0- a; 还是用数组来快速定位。
代码如下
#include<stdio.h>
#include<string.h>
using namespace std;
int hash[2000005];
		 
int main(){
	int a,b,c,d;
	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(int i=1;i<=100;i++){
			for(int j=1;j<=100;j++){
				hash[a*i*i+b*j*j+1000000]++;//因为最大的数是50*100*100+50*100*100等于1000000,所以加上1000000以防数组越界;
			}
		}
		int sum=0;
		for(int i=1;i<=100;i++){
			for(int j=1;j<=100;j++){
				sum+=hash[1000000-c*i*i-d*j*j];
			}
		}
		printf("%d\n",sum*16);//由于解的平方一定为正数,可以只枚举解为正数的情况,然后每一个解都对应一正一负两个数,四个解一共可以有16种情况,所有在最后结果中乘上16;  	
	}	
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值