这是一道典型的hash函数题目,构造出来的hash函数是
hash=num+MAXN; 其中,应先把该方程化成新的形式为:
a4*x4^3+a5*x5^3=-(a1*x1^3+a2*x2^3+a3*x3^3)
而num是 “a1*x1^3+a2*x2^3+a3*x3^3 ” 的各种情况下对应的值,MAXN则是常数 “3*50*50*50*50”,开数组是建议先开char型,再利用运算的优先级别来保存int 型数据,否则很容易MLE~囧
以下是代码:
#include "stdio.h"
#include "string.h"
#include "math.h"
#define MAXN 3*50*50*50*50+1
char hash[2*3*50*50*50*50+MAXN];
int a[7],ans;
int Fun(int x)
{
return x*x*x;
}
int main()
{
while(scanf("%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5])==5)
{
ans = 0;
memset(hash,0,sizeof(hash));
for(int x1 = -50;x1< = 50;x1++){
if(!x1) continue;
for(int x2 = -50;x2< = 50;x2++){
if(!x2) continue;
for(int x3 = -50;x3< = 50;x3++){
if(!x3) continue;
int num = a[1]*Fun(x1)+a[2]*Fun(x2)+a[3]*Fun(x3);
num* = -1;
hash[num+MAXN]++;
}
}
}
for(int x4 = -50;x4< = 50;x4++){
if(!x4) continue;
for(int x5 = -50;x5< = 50;x5++){
if(!x5) continue;
int num = a[4]*Fun(x4)+a[5]*Fun(x5);
if(hash[num+MAXN]) ans+ = hash[num+MAXN];
}
}
printf("%d/n",ans);
}
return 0;
}