Блог пользователя yermak0v

Автор yermak0v, 12 лет назад, По-русски

Привет всем.
Сразу приведу ссылку на задачу http://informatics.mccme.ru/moodle/mod/statements/view.php?id=2307.
Как такое вообще возможно?
Или же это специфика функции math.sqrt() реализированной в питоне?

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Может там сыграть на переполнении?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    На питоне? Со встроенное длинкой? Или же длинка только для целых?

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Я конечно кривой , но гугл не знает различий в питоне 2.7 и питоне 3 в выполнении sqrt. Я так понимаю что в направлении различия версий питона нужно покопать)

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +21 Проголосовать: не нравится

      < sarcasm> Ну да, ну да, "со встроенной длинкой". И оно вам в длинке точно посчитает. И sin(1). < /sarcasm>

      Не надо надеяться на магию, и надо понимать, как работает используемый вами инструмент. ИМХО, это большой минус языков вроде питона (точнее, даже не языка, а культуры, сложившейся вокруг него). Многие "программисты" полностью полагаются на магию, не понимая, как оно работает на самом деле.

      • »
        »
        »
        »
        12 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

        меня при изучении питоне удивило что не могу найти за сколько работает какая-нибудь функция встроеная. Есть ли аналог сайту для с++. Конкретно интересует время выполнения.А то нет понимания как написаны функции питона и получается такой себе кот в мешке.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      длинка только для целых. для вещественных в обеих версиях используется обычный сишный double, так что не очень понятно, для чего именно третий думаю, что и в корне различий не должно быть..

»
12 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

В темах указан бинарный поиск по ответу. Вот и нужно думать в этом направлении.

  • »
    »
    12 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится +7 Проголосовать: не нравится

    Казалось бы, не очевидно почему бы этой штуке быть монотонной по x, если не понятно, когда это верно.

    Поищите например минимальное неотрицательное целое такое, что x/2*2!=x таким спосоом (деление целочисленное)

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А разве для целочисельного деления — ответ не 1? Или смысл в том, что бы найти его бинпоиском?

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Смысл в том, что бинпоиском его нельзя искать по понятным причинам и прежде чем искать бинпоиском ответ на исх.задачу(как советовали) хорошо бы для начала понять почему бинпоиск будет работать.

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

      Она не монотонная. Для 5x1018 + 1 и 5x1018 - 1 ответ: !=, для 5x1018 ответ: ==

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится -8 Проголосовать: не нравится
»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Мне кажется, фича в том, что считается это в нецелых, которые вроде не длинка, а обычные даблы со всеми вытекающими ошибками. Например при i = int(1e230) уже даже нельзя вызвать math.sqrt(i*i)

»
12 лет назад, # |
  Проголосовать: нравится -19 Проголосовать: не нравится

Кто-то пробывал уже отослать с идеей переполнения?)

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +7 Проголосовать: не нравится

Долбил с другом эту задачу. Сдали. Прошла с первой попытки. В первой правке подсказка.

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится -20 Проголосовать: не нравится

Мда уж. Задача простая же.

Подсказка в первой правке.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Может докажете почему это работает? Почему если для числа 100 все хорошо, то для числа 97 тоже?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Я не опирался на монотонность функции, или особенностях даблов. Просто искал верхнюю границу ответа while (math.sqrt (x * x) == x) x++. Где в виде x подставлял степени 10ки. Как только на 10 ^ 16 ответ нашелся быстро (10 ^ 16 + 1). Начал уменьшать старшие разряды, и просто брутфорсом проверял, быстро ли ответ найдется. То есть брал например 9 * 10 ^ 15, и увеличивал или уменьшал в зависимости от того, быстро нашелся ответ или нет. Я не знаю, как доказать это, скажем так, само как — то вышло :)

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится

        вот вы посмотрели, для 100 все хорошо, для 1000 все хорошо ... , плохо для 10^16+1, и начали искать на промежутке 10^15...10^16, так? А почему для числа 578 все верно?

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Что вы имеете ввиду под 578? Я смотрел числа от 10 ^ 15 до 10 ^ 16, последовательно справа налево строя префикс числа, проверяя быстро ли находится ответ, где то по 1.5 — 2 секунды на каждое изменение числа, за это время мы пройдемся по внушительному количеству чисел с заданным префиксом, и поэтому интуитивно понимая, что число нужно брать больше.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится

            578 — любое число, меньшее 10^15, не являющееся степенью десятки

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Я предположил, что поскольку все дело в точности, то чем больше число, тем больше в его окрестности "плохих" чисел. Вверху NurlashKO сдал бинпоиск по окрестности точек, что то такое, только конструктивом сделал я :)

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

Решение в одну строку