POJ 1840 Eqs

来源:互联网 发布:网络直播培训机构 编辑:程序博客网 时间:2024/06/05 03:13

本题主要就是一开始的想法,想到后就比较水了。(没想到啊。。。)解5元方程组,每个未知数从-50~50,先三个一组枚举所有可能值,记录下次数,剩下的两个一组,出现之前出现过的值即将总数加上当前值之前出现过的次数(因为未知数正负对称,找与自己相同的值亦可,不一定非要找相反数,不过没什么实际差别),记录出现次数时,因为范围较大,无法直接开数组,按下标对应记录。所以Hash下就行。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=1000000;const int hv=999983;int a1,a2,a3,a4,a5;int sum;struct Node{    int idx;    int num;}r[N];int powerf(int x){    return x*x*x;}void hashf(int x){    int k=x%hv;    if(k<0)k=k+hv;    if(r[k].num!=0)    {        if(r[k].idx==x)r[k].num++;        else        {            int z=k;            while(r[z].num!=0)            {                if(r[z].idx==x)                {                    r[z].num++;                    break;                }                z++;            }            if(r[z].num==0)            {                r[z].idx=x;                r[z].num++;            }        }    }    else    {        r[k].idx=x;        r[k].num++;    }}void Find(int x){    int k=x%hv;    if(k<0)k=k+hv;    while(r[k].num!=0)    {        if(r[k].idx==x)        {            sum+=r[k].num;            break;        }        k++;    }}int main(){    sum=0;    for(int i=0;i<N;i++)    {        r[i].num=0;        r[i].idx=0;    }    scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);    for(int i=-50;i<=50;i++)    {        for(int j=-50;j<=50;j++)        {            for(int k=-50;k<=50;k++)            {                if(i==0||j==0||k==0)continue;                int x=powerf(i)*a1+powerf(j)*a2+powerf(k)*a3;                hashf(x);            }        }    }    for(int i=-50;i<=50;i++)    {        for(int j=-50;j<=50;j++)        {            if(i==0||j==0)continue;            int x=powerf(i)*a4+powerf(j)*a5;            Find(x);        }    }    printf("%d\n",sum);    return 0;}