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 ;
}

 

你可能感兴趣的:(poj)