思路:
這題很明顯就是二分,感覺自己對二分的理解不夠,導致比賽時調了一個小時還沒有出來。這里我們把整個2*k-1行字符的前綴和當做一個單調遞增的序列,這樣就符合了二分的性質,然后先判斷2*k-1行的和是否超過x,沒有就直接輸出2*k-1,否則二分計算答案,對於每一個mid,我們判斷是否超過k,沒超過的部分和超過的部分分別進行等差數列求和,加起來就是從第一行到這行的總數。
代碼:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1000, mod = 998244353;
ll k, x;
int n;
int a[N];
//記得開long long
ll cal(ll mid)
{
ll res = 0;
if(mid <= k) return (1 + mid) * mid / 2;
else
{
ll sum = (1 + k) * k / 2;
res = sum;
mid -= k;
return res + (k - 1 + k - mid) * mid / 2;
}
}
void solve()
{
cin >> k >> x;
if(cal(2 * k - 1) > x)
{
ll l = 1, r = 2 * k - 1;
while (l < r)
{
int mid = l + r >> 1;
if (cal(mid) >= x) r = mid;
else l = mid + 1;
}
cout << r << endl;
return;
}
cout << 2 * k - 1 << endl;
}
int main()
{
ios::sync_with_stdio(0);
int T;
cin >> T;
while(T --)
{
solve();
}
return 0;
}
