Description
a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0
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}.
Determine how many solutions satisfy the given equation.
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
题目链接:http://poj.org/problem?id=1840
解法类型:hash
解题思路:对方程变下形就可以了,然后直接建立hash表。这里有很多建立hash表的方法,可以直接暴力建立没有冲突情况的hash表,但内存会消耗很多。因此可以在建立时加冲突解决情况的处理,对其值取模,建立闭散性的hash表,极大地降低了内存的使用率,但同时带来了时间消耗的增加。
算法实现:
//STATUS:C++_AC_2188MS_7948K
#include<stdio.h>
#include<string.h>
const int MAXN=999991;
int hash(int s);
int num[MAXN],saves[MAXN],p[110];
int main()
{
// freopen("in.txt","r",stdin);
int i,x1,x2,x3,x4,x5,a1,a2,a3,a4,a5,sum,t,ways;
for(i=-50;i<0;i++) //初始化
p[i+50]=i*i*i;
for(i=1;i<=50;i++)
p[i+49]=i*i*i;
while(~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5))
{
memset(num,0,sizeof(num));
memset(saves,0,sizeof(saves));
for(x1=0;x1<100;x1++) //hash表的构建
for(x2=0;x2<100;x2++)
for(x3=0;x3<100;x3++){
sum=a1*p[x1]+a2*p[x2]+a3*p[x3];
t=hash(sum);
num[t]++;
saves[t]=sum;
}
ways=0;
for(x4=0;x4<100;x4++) //hash表的查找
for(x5=0;x5<100;x5++){
sum=-(a4*p[x4]+a5*p[x5]);
t=hash(sum);
ways+=num[t];
}
printf("%d\n",ways);
}
return 0;
}
int hash(int s)
{
int t=s%MAXN;
if(t<0)t+=MAXN;
while(num[t]!=0 && saves[t]!=s) //hash表为空或者找到s
t=(t+3)%MAXN; //这里处理不好,会超时,看数据,看RP!
return t;
}
624



被折叠的 条评论
为什么被折叠?



