Author: | I. Tuphanov | Time limit: | 1 sec | |
Input file: | input.txt | Memory limit: | 256 Mb | |
Output file: | output.txt |
New Vasuki Challenge (NVC) is a race developed to make New Vasuki a new racing capital of the world. An outstanding feature of NVC is the distribution of start positions.
Let n be the number of cars taking place in NVC during the whole season. Each car has its id — integer number in range from 1 to n. A season consists of x races. Before a race each car takes a start position. There are n start positions, numbered from 1 to n.
In the beginning of a new season NVC director declares a permutation P = (p1, p2, …, pn). Before the first race car number i takes start position number i for each i from 1 to n. Before each next race start positions are permuted according to P: car which was on start position pi in the last race now goes to start position i.
Say, n = 6, x = 3, P = (4, 3, 6, 5, 1, 2). So, there will be three races and cars will stand in positions (1, 2, 3, 4, 5, 6) before the first race, (4, 3, 6, 5, 1, 2) before the second race, and (5, 6, 2, 1, 4, 3) before the third race.
A permutation P of size n is called feasible for given x iff:
For the example given above, (4, 3, 6, 5, 1, 2) is feasible because all three start position distributions are different, and if there were a forth race the distribution would be (1, 2, 3, 4, 5, 6) which already met in the first race.
Your task is to find a feasible permutation P for given n and x. If there are multiple solutions, output any of them.
Input file contains two integers n and x.
Output file must contain a feasible permutation. If a feasible permutation doesn't exist, output a single integer − 1.
2 ≤ n ≤ 103
2 ≤ x ≤ 106
No. | Input file (input.txt ) |
Output file (output.txt ) |
---|---|---|
1 |
|
|
Переформулируем задачу. Необходимо сгенерировать перестановку P порядка n. Условия, которые накладываются на перестановку P таковы:
Рассмотрим циклы перестановки P. Обозначим их длины через ni, а их количество через k. То есть, n1 + … + nk = n. Каждое очередное применение перестановки сдвигает циклы. Перестановка P, применённая к единичной ni раз возвращает все элементы i-ого цикла на свои места. Таким образом, первая повторившаяся перестановка будет единичной (I) и возникнет она когда все циклы прокрутятся на полные обороты. То есть, x должно быть минимальным положительным числом, делящимся на все ni, то есть их НОК.
Таким образом, если найдётся перестановка с разбиением на циклы таким, что НОК их длин будет составлять x, она будет являться решением задачи. С другой стороны, по разбиению на циклы несложно сгенерировать и саму перестановку. Так, например, цикл длины m представляет собой перестановку вида 2, 3, …, m, 1. Итак, исходная задача эквивалентная следующей: необходимо разбить число n на слагаемые ni, так чтобы их НОК был равен x.
Для решения получившейся задачи рассмотрим разложение числа x на простые множители. Поскольку НОК набора чисел представляет собой произведение всех простых множителей из этого набора, взятых со максимальными по всему набору степенями, справедливы следующие утверждения:
Применим метод динамического программирования. Будем формировать числа ni одно за другим. Рассмотрим k-ый шаг алгоритма. К этому моменту уже сформирован набор Sk = {n1, n2, …, nk − 1} и на текущем шаге следует выбрать число nk. При этом, вне зависимости от конкретного набора Sk текущее состояние может быть описано двумя числами: текущей частичной суммой n1 + n2 + … + nk − 1 и битовой маской, в которой для каждого простого числа p, входящего в разложение x со степенью alfa установлена единица тогда и только тогда, когда в наборе Sk имеется число, делящееся на palfa.
Оценим количество состояний. Первое число (текущая частичная сумма) не может превосходить n, в то время как максимальное число бит в битовой маске соответствует максимальному количеству различных простых делителей числа x и при ограничениях задачи не может превосходить 7. Итого, имеем не более (1000 + 1)27 состояний. Для оптимизации количества переходов можно перебирать не все возможные nk, а только делители числа x. При такой реализации решение с запасом укладывается и по времени, и по памяти.