POJ 1840 Eqs

    求满足公式的解有多少种,其中xi!=0;这道题应该要缩小枚举的范围,将等式化为两边相等,即a1x13+ a2x23+ a3x33= - (  a4x43+ a5x53     或者前面两项后面三项都是一样的。所以首先要枚举右边的值可以有那些,再枚举左边的值看那些可以和右边的值相等即可。还有一个地方值得注意,做这道题我本来也是想接触hash的,所以3*50^4=18750000,一千万的数组很大,而且每个值可能有多种答案,所以需要hash来节约空间。

代码:

#include<iostream>
#include<vector>
#define maxn 87719
using namespace std;
struct node
{
       int x4,x5,m;
       node(int x,int y,int z):x4(x),x5(y),m(z){}
       node(){}
};
vector<node> hash[maxn];
int main()
{
    int a1,a2,a3,a4,a5,cnt,m;
    int i,j,k,r,s,it;
   // freopen("out.txt","w",stdout);
    while( scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)!=EOF){
           
           for( i=-50;i<=50;i++)
            for( j=-50;j<=50;j++){
                 m=a4*i*i*i+a5*j*j*j;
                 if( i==0||j==0) continue;
                 if( m>=0)
                     hash[m%maxn].push_back(node(i,j,m));
                 else
                     hash[(-m)%maxn].push_back(node(i,j,m));
           }
           cnt=0;
           for( i=-50;i<=50;i++)
            for( j=-50;j<=50;j++)
             for( k=-50;k<=50;k++){
                  if( i==0||j==0||k==0) continue;
                  m=a1*i*i*i+a2*j*j*j+a3*k*k*k;
                  if( m>=0)
                       r=m%maxn; 
                  else 
                       r=(-m)%maxn;
                  s=hash[r].size();
                  for( it=0;it<s;it++)
                       if( hash[r][it].m+m==0){
                           cnt++;
                       }
           }
           printf("%d\n",cnt);
    }                                      
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值