Eqs--POJ 1840

1、题目类型:数论、排序、哈希表。

2、解题思路:(1)将-50...50所有整数的3次幂打表;(2)降低运算数量级,将等式分为两部分,这样就由5维操作转换为3维和2维;(3)对保存的3维数据、2维数据的数组结果进行排序,便于后续的比较;(4)对两个数组进行匹配,寻找等值,其中注意处理相邻多个值相等的情况。

3、注意事项:注意遇到相邻情况相等,需彼此加加;输出应为长整型;此题在寻找相等数值时可用哈希表查找,提高速度。

4、实现方法:

#pragma warning (disable:4786)
#include
<iostream>
#include
<algorithm>
#include
<map>
using namespace std;

int table[120],cnt;
__int64 ax[
10010],bx[1000010];

void SetTable()
{
cnt
=0;
for(int i=-50;i<=50;i++)
if(i!=0)
table[cnt
++]=i*i*i;
}

int main()
{
int a,b,c,d,e;
int i,j,k,l,x,y;
__int64 ans;
SetTable();
while(cin>>a>>b>>c>>d>>e)
{
map
<__int64,int> M;
ans
=0;
x
=0;
for(i=0;i<cnt;i++)
{
for(j=0;j<cnt;j++)
{
ax[x
++]=a*table[i]+b*table[j];
}
}
y
=0;
for(i=0;i<cnt;i++)
{
for(j=0;j<cnt;j++)
{
for(k=0;k<cnt;k++)
{
bx[y
++]=-(c*table[i]+d*table[j]+e*table[k]);
}
}
}
sort(ax,ax
+x);
sort(bx,bx
+y);
i
=0,j=0;
while(i<x && j<y)
{
if(ax[i]==bx[j])
{
k
=1;
while(i+k<x && ax[i+k]==bx[j])
{
k
++;
}
l
=1;
while(j+l<y && ax[i]==bx[j+l])
{
l
++;
}
ans
+=l*k;
i
+=k;
j
+=l;
continue;
}
if(ax[i]<bx[j])
i
++;
else
j
++;
}
printf(
"%I64d\n",ans);
}
return 0;
}

 

posted @ 2010-08-20 20:40  勇泽  阅读(386)  评论(0编辑  收藏  举报