hdu1496 Equations(hash表)

题目链接:点击打开链接

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

解题思路:hash+优化

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

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

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

代码:

#include 
#include 
#define MOD 100003
using 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;
}


你可能感兴趣的:(hash)