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