POJ Eps(1840)-分组&枚举

来源:互联网 发布:狼顾之相真存在么 知乎 编辑:程序博客网 时间:2024/05/08 17:50

题意:给定系数,求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 100010using 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;}



0 0
原创粉丝点击