4022209_ac_1110ms_204k.cpp

来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 58 行

CPP
58
字号
#include <stdio.h>

__int64 fmax(__int64 a, __int64 b)
{
	return a > b ? a : b;
}

__int64 fmin(__int64 a, __int64 b)
{
	return a < b ? a : b;
}

//i ^ 2 + 100000 * i + j ^ 2 - 100000 * j + i * j

int main()
{
	int cas;
	__int64 b, c;
	__int64 n, m, j, cnt;
	__int64 max, min, mid;

	scanf("%d", &cas);
	while (cas--)
	{
		scanf("%I64d%I64d", &n, &m);
		max = fmax(n * n + 100001 * n - 99999, 3 * n * n);
		min = fmin(3, n * n + 100001 - 100000 * n + n);
		while (min < max)
		{
			mid = (min + max) >> 1;
			cnt = 0;
			for (j = 1; cnt < m && j <= n; j++)
			{
				b = 100000 + j;
				c = j * (j - 100000);
				__int64 mmin, mmax, mmid;
				mmin = 1;mmax = n + 1;
				while (mmin < mmax)
				{
					mmid = (mmin + mmax) >> 1;
					__int64 tmp = mmid;
					__int64 v = tmp * tmp + b * tmp + c;
					if (v > mid)
						mmax = mmid;
					else
						mmin = mmid + 1;
				}
				cnt += mmin - 1;
			}
			if (cnt >= m)
				max = mid;
			else
				min = mid + 1;
		}
		printf("%I64d\n", min);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?