Как я могу эффективно решить эту проблему кодирования, которая включает в себя операцию по модулю? - PullRequest
0 голосов
/ 06 января 2019

Нам дано целое число «N». Мы можем выбрать любые 2 числа (a и b) в диапазоне (от 1 до z). Значение L определяется как

L = Max(( (N%a) %b) %N)  

Мы должны рассчитать количество пар (a, b), которые дают (ые) значение 'L'. Я знаю решение для грубой силы, один, O (n 2 ). Есть ли более эффективный способ решения этой проблемы?!

1 Ответ

0 голосов
/ 07 января 2019

Единственный способ, которым я могу расшифровать Max(( (N%a) %b) %N), состоит в том, что максимум берется для всех пар a, b. Если я не прав, пожалуйста, не обращайте внимания на все остальное.

В случае z > N/2:

  • Во-первых, обратите внимание, что если a и b больше N, то (N%a) % b дает N, поэтому (N%a) %b) %N дает 1, что неудовлетворительно мало. Поэтому хотя бы один из них должен быть меньше N.

  • Во-вторых, обратите внимание (еще лучше, докажите), что максимальное значение N % a достигается, когда a равно N/2 + 1 для четных N и (N + 1)/2 для нечетных ( важно примечание : это половина следующего кратного 2 после N). Назовите это maximizer.

  • Наконец, обратите внимание, что любое значение b больше, чем по модулю, оставляет его нетронутым. Докажите, что это действительно желаемый максимум.

Теперь у вас достаточно фактов, чтобы придумать эффективную однострочную программу (не забудьте о случае a > N, b = maximizer).

Та же логика работает для z < N/2. Найти максимизатор немного сложнее, но все же возможно в O(1) (см. важное примечание выше).

...