fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. ll n, m, k;
  11.  
  12. // x càng lớn thì số thứ tự của x càng lớn
  13. // Số thứ tự của x có >= k hay không
  14. // Số thứ tự của x = (số thằng có trong bảng <= x)
  15. bool check(ll x) {
  16. // vì n * m <= 1e9 => min(n, m) <= sqrt(1e9)
  17. // nên mình for theo min(n, m) để tiết kiệm thời gian
  18. // ở đây giả sử như n <= m, nếu n > m thì ta swap n, m cho nhau
  19. ll cnt = 0;
  20. for (ll i = 1; i <= n && i * i <= x; i++) {
  21. // => j^2 <= x - i^2
  22. // <=> j <= sqrt(x - i^2)
  23. ll j = sqrt(x - i * i);
  24. j = min(j, m);
  25. cnt += j;
  26. }
  27. return (cnt >= k);
  28. }
  29.  
  30. int main() {
  31. ios::sync_with_stdio(0); cin.tie(0);
  32. cin >> n >> m >> k;
  33.  
  34. if (n > m) swap(n, m);
  35.  
  36. ll l = 2, r = n * n + m * m, ans = -1;
  37. while (l <= r) {
  38. ll mid = (l + r) >> 1;
  39. if (check(mid)) {
  40. ans = mid;
  41. r = mid - 1;
  42. }
  43. else {
  44. l = mid + 1;
  45. }
  46. }
  47.  
  48. cout << ans << '\n';
  49. }
Success #stdin #stdout 0.01s 5304KB
stdin
3 5 10 
stdout
18