唉,我的入门“hash”
题目链接:http://poj.org/problem?id=1840
CSUST 2012年暑假8月组队后第十二次个人赛:http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=11900#problem/B
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 8973 | Accepted: 4446 |
Description
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
Source
// Accepted 24656 KB 469 ms C++ 859 B 2012-08-22 09:34:05
#include
#include
const int maxn=25000000;//50^4*2*2
char hash[maxn];//注意定义为char类型,否则会超内存
int main()
{
int a1,a2,a3,a4,a5;
int i,j,k;
int sum,temp;
while(scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)!=EOF)
{
sum=0;
memset(hash,0,sizeof(hash));//开始全部初始化为0
for(i=-50;i<=50;i++)
{
for(j=-50;j<=50;j++)
{
if(i!=0 && j!=0)
{
temp=a1*i*i*i+a2*j*j*j;//从头开始枚举,把每一个结果都存入下标中,注意可能会有很多种情况temp一样,所以是hash[]++
hash[temp+maxn/2]++;//加上maxn/2保证数组下标为正数,
}
}
}
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)
{
temp=a3*i*i*i+a4*j*j*j+a5*k*k*k;
if(temp>=-maxn/2 && temp<=maxn/2)//注意判断范围,第二个范围较大,如果不判断,会溢出
{
sum+=hash[-temp+maxn/2];//因为前面已经枚举了所有的情况,所以后面加上没一个hash的下标所对应的值就行了,反正如果没有这种情况,下标对应的值也是0对结果没有影响。。。
}
}
printf("%d\n",sum);
}
return 0;
}