hdu1496 Equations(hash表)

来源:互联网 发布:ubuntu中vim命令大全 编辑:程序博客网 时间:2024/06/03 17:50

题目链接:点击打开链接

题意描述:给定公式,求有多少种解?

解题思路:hash+优化

1、如果a、b、c、d全正或全负则直接输出0

2、由于解的区间是对称的,所以我们只需要枚举1~100之间的就可以了,结果ans*16即可

3、判断某个数是否存在此处用到了hash表处理

代码:

#include <cstdio>#include <cstring>#define MOD 100003using namespace std;int a,b,c,d;long long ans;int f[100010],g[100010];int p[101];int Hash(int x){    int t=x%MOD;    if(t<0)        t+=MOD;    while(f[t]!=0&&g[t]!=x)        t=(t+1)%MOD;    return t;}int main(){    for(int i=1;i<=100;i++)///1        p[i]=i*i;    while(~scanf("%d%d%d%d",&a,&b,&c,&d)){        if((a>0&&b>0&&c>0&&d>0)||(a<0&&b<0&&c<0&&d<0)){///2            printf("0\n");continue;        }        memset(f,0,sizeof(f));        memset(g,0,sizeof(g));        c=-c;        d=-d;        int s,t;        for(int i=1;i<=100;++i) for(int j=1;j<=100;++j)///3        {            s=p[i]*a+p[j]*b;            t=Hash(s);            f[t]++;g[t]=s;        }        ans=0;        for(int i=1;i<=100;++i) for(int j=1;j<=100;++j){            s=p[i]*c+p[j]*d;            t=Hash(s);            ans+=f[t];        }        printf("%I64d\n",ans*16);///4    }    return 0;}


0 0