poj 1840 Eqs(二分)

10 篇文章 0 订阅
Eqs
Time Limit: 5000MS Memory Limit: 65536K
Total Submissions: 10433 Accepted: 5072

Description

Consider equations having the following form:
a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0
The coefficients are given integers from the interval [-50,50].
It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}.

Determine how many solutions satisfy the given equation.

Input

The only line of input contains the 5 coefficients a1, a2, a3, a4, a5, separated by blanks.

Output

The output will contain on the first line the number of the solutions for the given equation.

Sample Input

37 29 41 43 47

Sample Output

654
 
题意:给出等式a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,其中所有系数ai>=-50,ai<=50,所有xi满足 xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 要求出解的个数
思路:如果直接暴力枚举复杂度为100^5,显然TLE,我们可以先枚举前面的x1,x2,x3,用一个一百万的数组保存a1x13+ a2x23+ a3x33  的结果,然后枚举后面的x4,x5,对每个a4x43+ a5x53的结果在前面的数组中进行二分查找。
特别注意:因为解不止一个,如果二分时找到解立即返回,然后解++,这样做解的个数就会减少,是错误的做法。正确的做法是分别用二分找上界和下界,解+=(上界-下界)
 
AC代码;
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <iostream>

using namespace std;
const int maxn=1000005;
int hash[maxn];
int cnt;
int get_low(int x)   //二分找下界
{
    int low=0,high=cnt-1;
    int mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(hash[mid]<x)
            low=mid+1;
        else
            high=mid-1;
    }
    return low;
}
int get_high(int x)    //二分找上界
{
    int low=0,high=cnt-1;
    int mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(hash[mid]>x)
            high=mid-1;
        else
            low=mid+1;
    }
    return low;
}
int main()
{
    int coe[5];
    for(int i=0; i<5; i++)
        cin>>coe[i];
    cnt=0;
    for(int i=-50; i<=50; i++)
    {
        if(i==0) continue;
        for(int j=-50; j<=50; j++)
        {
            if(j==0) continue;
            for(int k=-50; k<=50; k++)
            {
                if(k==0) continue;
                hash[cnt++]=coe[0]*i*i*i+coe[1]*j*j*j+coe[2]*k*k*k;
            }
        }
    }
    sort(hash,hash+cnt);
    int ans=0;
    for(int i=-50; i<=50; i++)
    {
        if(i==0) continue;
        for(int j=-50; j<=50; j++)
        {
            if(j==0) continue;
            int temp=0-(coe[3]*i*i*i+coe[4]*j*j*j);
            ans+=(get_high(temp)-get_low(temp));
        }
    }
    cout<<ans<<endl;
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值