Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 10433 | Accepted: 5072 |
Description
Input
Output
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<