kdzhr

Квадраты и кубы 2.0

Mar 13th, 2020
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. // 70 https://informatics.mccme.ru/mod/statements/view3.php?id=30793&chapterid=113758#1
  2.  
  3. # include <iostream>
  4. # include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. uint64_t pow2(uint64_t n) {
  9.     uint64_t left = 1;
  10.     uint64_t right = n;
  11.     while (right - left > 1) {
  12.         uint64_t mid = (left + right) / 2;
  13.         if (mid * mid > n) {
  14.             right = mid;
  15.         } else {
  16.             left = mid;
  17.         }
  18.     }
  19.     return left;
  20. }
  21.  
  22. uint64_t pow2_ceil(int64_t n) {
  23.     if (n < 1) {
  24.         return 1;
  25.     }
  26.     uint64_t left = 1;
  27.     uint64_t right = n;
  28.     while (right - left > 1) {
  29.         uint64_t mid = (left + right) / 2;
  30.         if (mid * mid < n) {
  31.             left = mid;
  32.         } else {
  33.             right = mid;
  34.         }
  35.     }
  36.     return right;
  37. }
  38.  
  39. uint64_t pow3(uint64_t n) {
  40.     uint64_t left = 1;
  41.     uint64_t right = n;
  42.     while (right - left > 1) {
  43.         uint64_t mid = (left + right) / 2;
  44.         if (mid * mid * mid > n) {
  45.             right = mid;
  46.         } else {
  47.             left = mid;
  48.         }
  49.     }
  50.     return left;
  51. }
  52.  
  53. uint64_t pow3_ceil(uint64_t n) {
  54.     uint64_t left = 1;
  55.     uint64_t right = n;
  56.     while (right - left > 1) {
  57.         uint64_t mid = (left + right) / 2;
  58.         if (mid * mid * mid < n) {
  59.             left = mid;
  60.         } else {
  61.             right = mid;
  62.         }
  63.     }
  64.     return right;
  65. }
  66.  
  67. int main() {
  68.     int64_t a, b, k;
  69.     cin >> a;
  70.     cin >> b;
  71.     cin >> k;
  72.     int64_t res = 0;
  73.     int64_t null = 0;
  74.     uint64_t pow_a = pow2_ceil(a);
  75.     uint64_t pow_b = pow2(b);
  76.     for (size_t i = pow3_ceil(a); i <= pow3(b); i++) {
  77.         int64_t left = max(pow2_ceil(i * i * i - k), pow_a);
  78.         int64_t right = min(pow2(i * i * i + k), pow_b);
  79.         res += max(right - left + 1, null);
  80.     }
  81.     cout << res;
  82.     return 0;
  83. }
Add Comment
Please, Sign In to add comment