简单的二分套二分的题,分析一下单调性即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define int long long
using namespace std;
int T,n,m,l,r,mid,ans;
inline bool jay(int x)
{
int l,r,mid;
int ans,sum=0;
for (register int j=1; j<=n; ++j)
{
l=0; r=n; ans=0;
while (l<=r)
{
mid=l+r>>1ll;
int i=mid;
if (i*i+100000*i+j*j-100000*j+i*j<=x) ans=mid,l=mid+1;
else r=mid-1;
}
sum+=ans;
}
if (sum>=m) return true;
return false;
}
signed main(){
scanf("%lld",&T);
while (T--)
{
scanf("%lld%lld",&n,&m);
l=-2e10; r=2e10; ans=0;
while (l<=r)
{
mid=l+r>>1ll;
if (jay(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
}
return 0;
}