POJ 1840 (空间和时间的换)

#include<iostream>
#include<fstream>

using namespace std;

static const int MAX = 100000;
static int htable[MAX][10];
static int num[MAX];

//#define DEBUG
/*	4556K	235MS */
int main()
{
#ifdef DEBUG
	fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif

	int a1, a2, a3, a4, a5;
	int total = 0;
	cin >> a1 >> a2 >> a3 >> a4 >> a5;

	int x1, x2, x3, x4, x5;
	for (x1 = -50; x1 <= 50; x1++)
	{	
		if (x1 == 0) continue;
		for (x2 = -50; x2 <= 50; x2++)
		{
			if (x2 == 0) continue;
			int r = a1 * x1 * x1 * x1 + a2 * x2 * x2 * x2;
			int i = r % MAX;
			i = i < 0 ? (i + MAX) : i;
			htable[i][num[i]++] = r;
		}
	}

	for (x3 = -50; x3 <= 50; x3++)
	{	
		if (x3 == 0) continue;
		for (x4 = -50; x4 <= 50; x4++)
		{	
			if (x4 == 0) continue;
			for (x5 = -50; x5 <= 50; x5++)
			{
				if (x5 == 0) continue;
				int r = a3 * x3 * x3 * x3 + a4 * x4 * x4 * x4 + a5 * x5 * x5 * x5;
				r = -r;
				int i = r % MAX;
				i = i < 0 ? (i + MAX) : i;

				int j;
				for (j = 0; j < num[i]; j++)
				{	if (htable[i][j] == r)	total++;	}
			}
		}
	}
	cout << total << endl;

	return 0;
}

  a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,  x13是x1的3次方。
求满足以上条件的(x1, x2, x3, x4, x5)共有多少个?  xi∈[-50,50], xi != 0。


最直接的方法是5个嵌套循环每当找到一组解计数就加一。
但是循环的次数太多 100^5就是10^10,运行时间很长。
一个替代的方法就将等式进行拆分分成两部分
                                a1x13+ a2x23 = -(a3x33+ a4x43+ a5x53)。

       1.先计算一边并存储结果。
       2.计算另一半到结果中查找是否存在
提高速度的方法就是提高查找速度,时候hash方法。散列表的大小并没有经过仔细的论证,
可能空间有点大。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值