poj1840

#include<iostream>
using namespace std;

int cube[102];
int a,b,c,d,e,ans,temp;
const int MAX = 12500000;
short arr[2*MAX+1];
int main(){
	cin>>a>>b>>c>>d>>e;
	for(int i=-50;i<=50;i++){
		cube[i+50]=i*i*i;
	}
	memset(arr,0,sizeof(arr));
	for(int x1=-50;x1<=50;x1++){
		if(x1==0)
			continue;
		for(int x2=-50;x2<=50;x2++){
			if(x2==0)
				continue;
			arr[a*cube[x1+50]+b*cube[x2+50]+MAX]++;
		}
	}
	ans=0;
	for(int x3=-50;x3<=50;x3++){
		if(x3==0)
			continue;
		for(int x4=-50;x4<=50;x4++){
			if(x4==0)
				continue;
			for(int x5=-50;x5<=50;x5++){
				if(x5==0)
					continue;
				temp = c*cube[x3+50]+d*cube[x4+50]+e*cube[x5+50];
				if(temp>MAX||temp<-MAX)
					continue;
				ans+=arr[MAX-temp];
			}
		}
	}
	cout<<ans<<endl;	
	return 0;
}

将等式移项,把项数较少的一边结果hash。选择项数较少的可以使hash数组尽可能小,但是项数不能太少,因为另一边项数太多会TLE。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值