关闭

poj1840

980人阅读 评论(0) 收藏 举报
#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。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:227341次
    • 积分:3672
    • 等级:
    • 排名:第9441名
    • 原创:98篇
    • 转载:52篇
    • 译文:1篇
    • 评论:51条
    文章分类
    最新评论