poj 1840 Eqs 二分

把a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 变换成 a1x13+ a2x23+ a3x33=—( a4x43+ a5x53 )这步很重要。

这样这个题就变成了,在一个很大的数组里,查找一个数是否存在,存在的话有几个?

View Code
#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;
}



posted @ 2011-12-02 11:40  104_gogo  阅读(119)  评论(0编辑  收藏  举报