В соревнованиях по программированию во множестве задач возникает следующий шаблон:
Приведенные числа A и B, которые огромны (может быть, 20 десятичных цифр или более), определяют число целых чисел X с A ≤ X ≤ B, которые имеют некоторое свойство P
SPOJ имеет множество задач, подобных этим для практики.
Если примеры интересных свойств включают:
- "сумма цифр X равна 60"
- "X состоит только из цифр 4 и 7"
- "X является палиндромным", что означает, что десятичное представление X равно его обратному (например, X = 1234321)
Я знаю, что если мы определим f (Y) как число таких целых чисел X ≤ Y, то ответом на наш вопрос будет f (B) - f (A - 1). Приведенная проблема заключается в том, как эффективно вычислить функцию f. В некоторых случаях мы можем использовать определенные математические свойства, чтобы придумать формулу, но часто свойства более сложны, и у нас не хватает времени для этого в конкурсе.
Существует ли более общий подход, который работает во многих случаях? И может ли он также использоваться для перечисления чисел с заданным свойством или вычисления некоторой агрегации на них?
Отличие состоит в том, чтобы найти k-е число с заданным свойством, которое, конечно, можно решить, используя двоичный поиск вместе с функцией счета.