哈希--hdu1496

来源:互联网 发布:文字播音软件 编辑:程序博客网 时间:2024/06/03 18:19

给定[-50,50]的a,b,c,d,x1,x2,x3,x4位于[-100,100],a * x1^ 2 + b * x2 ^ 2 + c * x3 ^ 2 + d * x4 ^ 2 = 0,的可能数。

由于a * x1 &^ 2 + b * x2 ^ 2最多只可能有 1e4个值,用哈希可以减小数组,可以减少初始化的时间。否则需要开2e6的数组。

#include <cstdio>

#include <iostream>

#include <cstring>

using namespacestd;

const int maxn =50021;//质数。//最多1e4个数

int f[maxn];

int g[maxn];//g[t]用来记录f[t]记录的key

int w[100 +1];


int Hash(int k)//**

{

    int t = k %maxn;

    if(t <0) t +=maxn;

    while(f[t] !=0 &&g[t] != k) t = (t +1) %maxn;//**

    return t;

}


int main()

{

    for (int i =1; i <=100; i ++) {

        w[i] = i * i;

    }

    int a,b,c,d;

    while (scanf("%d%d%d%d",&a,&b,&c,&d) !=EOF) {

        if(a >0 && b >0 && c >0 && d >0){printf("0\n");continue;}

        if(a <0 && b <0 && c <0 && d <0){printf("0\n");continue;}

        memset(f,0,sizeof(f));

        

        int k =0,p =0;

        for (int i =1; i <=100; i ++) {

            for (int j =1; j <=100; j ++) {

                k = a * w[i] + b *w[j];

                p = Hash(k);

                f[p] ++;g[p] = k;

            }

        }

        int ans =0;

        for (int i =1; i <=100; i ++) {

            for (int j =1; j <=100; j ++) {

                p = Hash( - c *w[i] - d *w[j]);//

                ans += f[p];

            }

        }

        printf("%d\n",ans *16);

    }

    return0;

}



原创粉丝点击