题意:给你一个多元多项式,并给定你多项式的系数,让你求在[-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;
}