大家要注意边界条件,每个人的实现方式不同#include<stdio.h>
long long int n,k,T;
long long int cal(long long int i,long long int j)
{
return i*i+100000*i+j*j-100000*j+i*j;
}
int find(long long int x)
{
long long int ans=0,j,l,r,m;
for(j=1;j<=n;j++)
{
l=0;r=n;
while(l<r)
{
m=(l+r+1)>>1;
if(cal(m,j)<x)
l=m;
else
r=m-1;
}
ans+=l;
}
return ans<k;
}
int main(void)
{
long long int l,r,m;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
l=-100000*n;r=3*n*n+100000*n;
while(l<r)
{
m=(l+r+1)/2;
if(find(m))
l=m;
else
r=m-1;
}
printf("%lld\n",l);
}
}
poj 3685 二分法(边界条件)
最新推荐文章于 2022-08-19 13:44:22 发布