A. Smart AEMShana!
题目传送门:
题面:
题目大意:
给予一个
m
∗
m
m*m
m∗m加法矩阵:
a
[
i
]
[
j
]
=
=
i
+
j
(
i
,
j
≥
1
)
a[i][j]==i+j (i,j≥1)
a[i][j]==i+j(i,j≥1)
求第k小的那个数字。
思路:
二分思想。
并且找矩阵规律。
1,3,6…
a
n
=
n
(
n
+
1
)
/
2
a_n=n(n+1)/2
an=n(n+1)/2
老超时,烦人,用了不常用的IO流。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 114514 + 10;
//ll const mod = 1e9 + 7;
ll f[maxn] = {0};
ll m, k;
inline ll solve() {
ll l = 0, r = m;
ll ans = 0;
while (l <= r) {
ll mid = (l + r) / 2;
if (mid * (mid + 1) / 2 >= k) {
ans = mid;
r = mid - 1;
} else l = mid + 1;
}
if (ans <= 0) {
l = 0, r = m - 1;
ans = -1;
k = k - m * (m + 1) / 2;
while (l <= r) {
ll mid = (l + r) / 2;
if (mid * (mid - 1) + 2 * k <= m * (m - 1)) {
ans = mid;
l = mid + 1;
} else r = mid - 1;
}
return (2 * m - ans + 1);
} else {
return (1 + ans);
}
}
int main() {
while (~scanf("%lld%lld", &m, &k)) {
printf("%lld\n", solve());
}
}