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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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