poj 1840 Eqs(二分)

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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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]>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<


 
 

你可能感兴趣的:(poj,水题)