Поиск всех подстрок в двоичном коде

359
20 октября 2017, 12:19

Доброго времени суток.
Подскажите примерный план решение следующей задачи:
Захар очень любит двоичные последовательности, особенно ему нравится их исследовать. У Захара также есть несколько любимых натуральных чисел, например, ему очень нравятся числа N и K. Как-то раз Захар понял, что хочет исследовать двоичные последовательности длины N, в которых каждая непрерывная подстрока, содержащая только единицы, имеет длину ровно K (последовательности, состоящие только из нулей, являются таковыми). Двоичная последовательность – последовательность, содержащая только нули и единицы. Подстрока – некоторое количество непрерывно идущих символов последовательности. Например, если N = 5, а K = 2, то существует 6 последовательностей, которые удовлетворяют этим требованиям: 00000, 11000, 01100, 00110, 00011, 11011. Прежде чем исследовать эти последовательности, Захар решил посчитать их количество. Так как Захар очень занят исследованием других двоичных последовательностей, он попросил вас помочь ему.

Формат файла входных данных:
В первой строке входных данных содержатся натуральные числа N и K, 1 <= K <= N <= 50.

Формат файла выходных данных:
Выведите количество двоичных последовательностей, в которых каждая подстрока, содержащая только единицы, имеет длину ровно K. Гарантируется, что ответ влезает в 64-х битный тип данных (long long в C++ или int64 в Pascal).

Я думал делать так: брать строку, состоящую из нулей в количестве N, а затем заменять нули на единицы в количестве k, перемещаясь по массиву символов, предварительно увеличивая счетчик значений. Только вот некоторые моменты не задались.

Answer 1

Я бы построил 2 бинарных дерева(от 1 и от 0 соответственно) Вот примерный псевдокод

если текущийУзел равен 0, то
    если N - текущаяВысотаДерева > K, то
        следующие узлы могут быть как 1 так и 0(добавляем оба)
    в противном случае
        следующий узел равен 0
в противном случае(текущийУзел == 1)
    если по ребру количество единиц < K, то
        следующий узел равен 1
    в противном случае
        следующий узел равен 0
READ ALSO
Пример по generics из Философии Java

Пример по generics из Философии Java

Приветствую всех! Читаю у Брюса Эккеля про дженерики, попался в качестве примера такой код:

233
Сохранение InMem DB в файл Android Room

Сохранение InMem DB в файл Android Room

Собственно, есть необходимость шифровать базу данных, сейчас работает так - все данные в бд зашифрованы, но сейчас все на SQLLiteБыло решено перевести...

244
Размен 100 рублей монетами 2, 5 и 10 [требует правки]

Размен 100 рублей монетами 2, 5 и 10 [требует правки]

ЗдравствуйтеКак посчитать аналитически число вариантов размена 100 рублей монетами по 10, 5 и 2 рубля? Как выглядит код прямого перебора?

317
Закрытие сокета по таймауту

Закрытие сокета по таймауту

как с этим бороться ?

246