题目:a1x13+ a2x23+
a3x33+ a4x43+
a5x53=0
The coefficients are given integers from the interval [-50,50].
The coefficients are given integers from the interval [-50,50].
It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}.
求上面这个方程的解的个数,这题可以用sort+二分或者Hash,用二分过了,就练习下hash做题吧,看见很多人开个大数组直接hash进去的,但为了练习下链接法解决碰撞(不过这样效率有点低)就不直接hash了。。。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int value,sum;
node *next;
};
const int inf=1<<26;
int L[10100];
node H[2000010];//开一百万的数组是4100+MS过的,开两百万的数组是1100+MS过的,各种囧o(╯□╰)o
int hash(int x)
{
x+=inf;
return x%1999999;
}
void enTable(int x)
{
int id=hash(x);
if(H[id].sum==0)
{
H[id].value=x;
H[id].sum++;
}
else{
node *p=&H[id];
while(p)
{
if(p->value==x)
{
p->sum++;
return ;
}
p=p->next;
}
node *q=(node *)malloc(sizeof(node));
q->value=x;
q->next=H[id].next;
q->sum=1;//这里之前是q->sum++,一直WA,改成q->sum=1就A了,不知说什么好了。。。
H[id].next=q;
}
}
int getRes(int x)
{
int id=hash(x);
if(H[id].sum==0)
return 0;
else if(H[id].value==x)
return H[id].sum;
else{
node *p=&H[id];
while(p)
{
if(p->value==x)
return p->sum;
p=p->next;
}
return 0;
}
}
int main()
{
int a,b,c,d,e;
while(~scanf("%d%d%d%d%d",&a,&b,&c,&d,&e))
{
int i,j,k,len=0;
__int64 res=0;
for(i=-50;i<=50;i++)
for(j=-50;j<=50;j++)
if(i!=0&&j!=0)
L[len++]=a*i*i*i+b*j*j*j;
for(i=-50;i<=50;i++)
for(j=-50;j<=50;j++)
for(k=-50;k<=50;k++)
if(i!=0&&j!=0&&k!=0)
{
int temp=c*i*i*i+d*j*j*j+e*k*k*k;
enTable(temp);
}
for(i=0;i<len;i++)
res+=getRes(L[i]*-1);
printf("%I64d\n",res);
}
return 0;
}