SkyHawk's blog

By SkyHawk, 12 years ago, In Russian

Подскажите, как решать эту задачу.

В обсуждениях есть решение вида: понятно, что для удобных чисел верно a2 = b·10n + a, следовательно a(a - 1) делится на 10n. Отсюда одно из чисел a,(a - 1) делится на 5n, другое — на 2n. Другими словами, a ≡ 1(mod2n) или a ≡ 2n - 1(mod2n) при условии, что a = 5n·k. Из этих равенств найдём а расширенным алгоритмом Евклида. Если найденный ответ состоит меньше, чем из n цифр, то его не считаем. Но это решение имеет сложность O(n4) (я прав?): алгоритм Евклида работает в среднем за О(log(a)) = O(n), на каждом его шаге происходит длинное деление за O(n2) (можно быстрее, но не уверен, что это поможет), и всё это надо повторить для всех N.

Есть другая идея за О(n3): запишем число 5n в бинарном виде. За O(n2) найдём такие k1 и k2,что 5n·k1 заканчивается на 00...001, а 5n·k2 заканчивается на 111...11 — это и будут искомые числа. Ввиду больших констант и n = 2000 это решение также по-видимому не актуально.

Спасибо заранее за любую помощь.

  • Vote: I like it
  • 0
  • Vote: I do not like it