poj 1840 (hash)

题意:给你一个多元多项式,并给定你多项式的系数,让你求在[-50,50]区间内可能的值的组合

思路:a1x1^3+ a2x2^3+ a3x3^3 = -(a4x4^3 + a5x5^3)
先求出左边能到达的值,对值进行hash。
用结构体hash速度比较慢2000+ms,用字符数组能标记到25000000,而且速度只有600+ms。虽然能在poj上通过但是它只能存一个字节的数如果是要记录出现的次数的话局限性太强,能存的数字太小只能记录到127左右
给出一组数据:0 0 0 0 0

#include<stdio.h>
#include<string.h>
#define max 1000010
#define ma  1000000
int a[6],he[max],xh,lf[52];
struct hell
{
    int vel,next,num;
}st[max];
int find(int x)
{
    return x>0?lf[x]:-lf[-x];
}
void add(int x)
{
    int f,h=(x%ma+ma)%ma;
    f=he[h];
    while(f!=-1)
    {
        if(st[f].vel==x)
        {
            st[f].num++;
            return;
        }
        f=st[f].next;
    }
    st[xh].vel=x;st[xh].num=1;
    st[xh].next=he[h];
    he[h]=xh++;

}
int query(int x)
{
    int h=(x%ma+ma)%ma;
    int cn=he[h];
    while(cn!=-1)
    {
        if(st[cn].vel==x)
          return st[cn].num;
          cn=st[cn].next;
    }
    return 0;

}
int main()
{
    int i,j,k,m,n;
       for(i=0;i<5;i++)
       scanf("%d",&a[i]);
       for(i=1;i<=54;i++)
       lf[i]=i*i*i;
       memset(he,-1,sizeof(he));
       xh=0;
       for(i=-50;i<=50;i++)
        if(i!=0)
         for(j=-50;j<=50;j++)
         if(j!=0)
         for(k=-50;k<=50;k++)
         if(k!=0)
         {
             int cnt=a[0]*find(i)+a[1]*find(j)+a[2]*find(k);
             add(cnt);
         }
         int sum=0;
         for(i=-50;i<=50;i++)
         if(i!=0)
         for(j=-50;j<=50;j++)
         if(j!=0)
         {
            int cbb=-a[3]*find(i)-a[4]*find(j);
            sum+=query(cbb);
         }
         printf("%d\n",sum);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值