#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。