二分临界值的代码
bool check(int mid)
{
__int128 sum = 0;
for (int i = 1; i <= n; i ++)
{
int k = (mid + a[i]) / 2 / a[i];
sum += (__int128)k * k * a[i];
}
return sum <= (__int128)M;
}
请在循环时判断无解:
bool check(int mid)
{
__int128 sum = 0;
for (int i = 1; i <= n; i ++)
{
int k = (mid + a[i]) / 2 / a[i];
sum += (__int128)k * k * a[i];
if (sum > (__int128)M) return false;
}
return sum <= (__int128)M;
}
这是因为循环中的 k 可达到 1018,单次循环 sum 不会爆掉,但是一共 2e5 次加会爆掉。