Как решить эту комбинаторную задачу подсчета? - PullRequest
0 голосов
/ 26 октября 2018

Для строки длиной n 3-digit (possible digits are 1, 2, 3) требуется вычислить количество всех возможных различных чисел, которые можно сформировать, используя следующую операцию:

1) If the current digit is 1, then add 0 to the current number.
2) If the current digit is 2, then subtract k from the current number.
3) If the current digit is 3, then add p to the current number.

Например, если n = 3, k = 2, and p = 5,затем ans = 10 следующим образом:

Все возможные последовательности n = 3:

111
112
113
121
122
123
131
132
133
211
212
...
...
333

Пример подсчета очков: (say, for 132) = 0+5-2 = 3

В настоящее время яРешение этой комбинаторной задачи выполняется следующим образом:

1) Calculating and saving all possible k's as 0k, 1k, 2k, 3k, ..., nk (Saved in array AK)
2) Calculating and saving all possible p;s as 0p, 1p, 2p, 3p, ..., np (Saved in array AP)
3) Iterating for each ith element in AK, iterate from 0 to (n-i) in AP and save each summation of AK[i] + AP[j] in a set.
4) Finally, calculating the size of the set, which is the answer.

К сожалению, этот подход имеет сложность O(n^2).

Существует ли линейное решение по времени для этой проблемы?

Еще несколько примеров для удобства:

n = 10000, p = 16, k = 3 => ans = 189848
n = 6, p = 5, k = 2 => ans = 28
n = 6, p = 5, k = 3 => ans = 28
n = 6, p = 5, k = 4 => ans = 28
...