poj 1840 Eqs 二分
把a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 变换成 a1x13+ a2x23+ a3x33=—( a4x43+ a5x53 )这步很重要。
这样这个题就变成了,在一个很大的数组里,查找一个数是否存在,存在的话有几个?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h>
#include <algorithm>
using namespace std;
int ar1[1000010],ar2[10010],cnt1,cnt2,ans;
void judge(int a)
{
int i,l=0,r=cnt2,mid;
while (l<=r)
{
mid=(l+r)/2;
if(ar2[mid]==a)
{
for(i=mid;ar2[i]==a;i++)ans++;
for(i=mid-1;ar2[i]==a;i--)ans++;
return;
}
else if(ar2[mid]<a)l=mid+1;
else r=mid-1;
}
}
int main()
{
int i,j,k,a,b,c,d,e;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
for (i=-50;i<=50;i++)
{
if(i==0)continue;
for (j=-50;j<=50;j++)
{
if(j==0)continue;
ar2[cnt2++]=d*i*i*i+e*j*j*j;
for (k=-50;k<=50;k++)
{
if(k==0)continue;
ar1[cnt1++]=a*i*i*i+b*j*j*j+c*k*k*k;
}
}
}
sort(ar2,ar2+cnt2);
for (i=0;i<cnt1;i++)
{
judge(-ar1[i]);
}
printf("%d\n",ans);
return 0;
}