Говорят, что функция имеет цикл длины n, если в ее области существует x, такой что f n (x) = x и f m (x) ≠ x при 0 <m <n , где верхний индекс n обозначает n - сложите приложение f . Обратите внимание, что цикл длины 1 является фиксированной точкой f (x) = x .
Ваша задача - реализовать биективную функцию от целых чисел до самих себя, которая имеет ровно один цикл каждой положительной длины n . Биективная функция - это взаимно-однозначное соответствие, т. Е. Каждое целое число сопоставляется ровно один раз. Наличие ровно одного цикла длины n означает, что существует ровно n различных чисел x, для которых f n (x) = x и f m (x) ≠ x при 0 <m <n .
Вот пример того, как такая функция может выглядеть вокруг x = 0 :
x ... -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
f(x) ... 2 4 6 -3 -1 1 -4 0 -2 5 7 -7 -6 3 -5 ...
Этот отрывок содержит циклы длиной от 1 до 5 :
n cycle
1 0
2 -2 1
3 -4 -3 -1
4 -5 6 3 7
5 -7 2 5 -6 4
...
Обратите внимание, что выше я использую «функцию» только в математическом смысле. Вы можете написать либо функцию, либо полную программу на выбранном вами языке, если она принимает одно (подписанное) целое число в качестве входных данных и возвращает одно (подписанное) целое число. Как обычно, вы можете принимать ввод через STDIN, аргумент командной строки, аргумент функции и т. Д. И выводить через STDOUT, возвращаемое значение функции или аргумент функции (out) и т. Д.
Конечно, многие языки (легко) не поддерживают целые числа произвольной точности. Хорошо, если ваша реализация работает только с диапазоном целочисленного типа вашего языка, если он охватывает хотя бы диапазон [-127, 127], и что она будет работать для произвольных целых чисел, если целочисленный тип языка был заменен на произвольный точные целые числа.
Применяются стандартные правила игры в гольф .