您的位置:首页 > 其它

hdu 1496 Equations

2012-02-28 16:30 399 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496

题目意思也就是给你四个数a,b,c,d,让你求满足等式a*x1^2+b*x2^2+c*x3^2+d*x4^2=0;的个数。其中未知数的范围是[-100,100]; 常规的n^4肯定超时。这是使用了hash的算法。时间复杂度为n^2. 程序中的w[a*p[i]+b*p[j]+1000000]++;数组的下标表示状态,值表示个数。sum+=w[-(c*p[i]+d*p[j])+1000000];累计计算 其实可以这样理解前边两项的和为10数组+100的话是w[110]==1;要想满足要求 在后边的计数中应该为sum+=w[110] 而后两项的和c*x3^2+d*x4^2应为-10 所以就有了[-(c*p[i]+d*p[j])+1000000].

后边加上1000000是为了 把负值变成正的。

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAX=50000;
int w[MAX];
int f[MAX],g[MAX];
int p[102];
int hash(int k)
{
int t=k%MAX;
if(t<0)
t+=MAX;
while(f[t]!=0&&g[t]!=k)
t=(t+1)%MAX;
return t;
}
int main()
{
int a,b,c,d,i,j,sum,tt,gg;
for(i=1;i<=100;i++)
p[i]=i*i;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
{
if(a>0&&b>0&&c>0&&d>0||a<0&&b<0&&c<0&&d<0)
{
printf("0\n");
continue;
}
memset(w,0,sizeof(w));
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
for(i=1;i<=100;i++)
for(j=1;j<=100;j++)
{
tt=a*p[i]+b*p[j];
gg=hash(tt);
f[gg]++;
g[gg]=tt;
}

sum=0;
for(i=1;i<=100;i++)
for(j=1;j<=100;j++)
{
tt=-(c*p[i]+d*p[j]);
gg=hash(tt);
sum+=f[gg];

}
printf("%d\n",sum*16);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: