POJ Eps(1840)-分组&枚举

题意:给定系数,求a1*x1^3+a2*x2^3+a3*x3^3+a4*x4^3+a5*x5^3 = 0方程式解的个数。 系数和x范围都是[-50, 50]但不包括0。

暴力解:上式转化为-(a1*x1^3+a2*x2^3) = a3*x3^3+a4*x4^3+a5*x5^3,
              循环层数就变为3层,空间复杂度100^3,并且和为负数的时候加上25000000,
              要建一个short cnt[25000001],用int空间不够;

#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
#define prime 999983
#define maxn 100010
using namespace std;
typedef long long llong;
int n,m,t,tot=0;
short cnt[25000001];
int cube[110];
int main()
{
    //freopen("D:\data.txt","r",stdin);
    int TT,i,j,k;
    int a1,a2,a3,a4,a5;
    for(i=-50;i<=50;i++)      cube[i+50] =i*i*i;
    while(~scanf("%d %d %d %d %d",&a1,&a2,&a3,&a4,&a5)){
        clearto(cnt,0);
        for(i=-50;i<=50;i++){
           if(i==0)     continue;
           for(j=-50;j<=50;j++){
              if(j==0)  continue;
              int sum = (-1)*(a1*cube[i+50]+a2*cube[j+50]);
              if(sum<0) sum+= 25000000;
              cnt[sum]++;
           }
        }
        int sum,ans =0;
        for(i=-50;i<=50;i++){
           if(i==0)     continue;
           for(j=-50;j<=50;j++){
              if(j==0)  continue;
              for(k=-50;k<=50;k++){
                 if(k==0)     continue;
                 sum= a3*cube[i+50]+a4*cube[j+50]+a5*cube[k+50];
                 if(sum<0)    sum+=25000000;
                 if(cnt[sum]) ans+=cnt[sum];
              }
           }
        }
        printf("%d\n",ans);
    }
    return 0;
}



你可能感兴趣的:(hash)