Весела гра, якщо вам нудно - гра Diffy . Це гра з одним гравцем, яка досить проста і може забирати багато часу.
Гра Diffy працює так: Ви починаєте зі списку невід'ємних цілих чисел, у цьому прикладі ми будемо використовувати
3 4 5 8
Тоді ви берете абсолютну різницю між суміжними числами
(8) 3 4 5 8
5 1 1 3
Потім ти повториш. Ви повторюєте, поки не зрозумієте, що ввели цикл. І тоді взагалі гра починається з початку заново.
3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0
Часто гра не має мети, ви просто пропонуєте час, роблячи арифметику в голові. Однак, коли мені приємно грати в цю гру, моя мета завжди спробувати вибрати період і спробувати побудувати гру, яка замикається на цей конкретний період.
Не всі ігри є періодичними, приклад, наведений вище, не є періодичним, наприклад, оскільки він врешті-решт досягає гри з усіма нулями і, отже, ніколи не може повернути її до вихідної позиції. Насправді здається, що переважна більшість ігор не періодично роблять кілька ігор, які є рідкісним каменем.
З огляду на гру, яка циклічно перебуває у певному періоді, тривіально зробити ще одну гру, яка циклічно з тим самим періодом, просто подвоївши послідовність. Наприклад гра:
1 0 1
Грає точно так само, як гра:
1 0 1 1 0 1
Насправді ми можемо вважати, що обидва - це справді безмежно повторювана гра:
... 1 0 1 ...
Ми вважатимемо їх однією грою заради цього виклику.
Аналогічним чином множення всієї послідовності на постійну також тривіально збереже період, тому ми знову будемо рахувати дві будь-які ігри, які відрізняються постійним коефіцієнтом як одна і та ж гра.
Нескінченні рядки ... 1 0 1 ...
і ... 0 1 1 ...
, очевидно, однакові рядки, зміщені одним символом. Ми не вважатимемо їх різними іграми, але коли одна досягне інших, це не буде вважатися кінцем циклу при визначенні періоду гри. Наприклад:
Дві гри
... 0 0 0 1 0 1 ... = A
... 0 0 1 1 1 1 ... = B
... 0 1 0 0 0 1 ... = A << 4
... 1 1 0 0 1 1 ... = B << 4
... 0 1 0 1 0 0 ... = A << 2
... 1 1 1 1 0 0 ... = B << 2
і
... 0 0 1 0 1 0 ... = A << 1
... 0 1 1 1 1 0 ... = B << 1
... 1 0 0 0 1 0 ... = A << 5
... 1 0 0 1 1 1 ... = B << 5
... 1 0 1 0 0 0 ... = A << 3
... 1 1 1 0 0 1 ... = B << 3
це обидві ігри з періодом 6. Вони не поділяють жодного терміна один з одним у будь-якій точці своїх циклів (на відміну від ... 1 1 0 ...
та, ... 1 0 1 ...
які дістаються одна до одної), але оскільки вони зміщені версії один одного, вони вважаються однією і тією ж грою під час підрахунку.
Відображення (або реверсування) нескінченної струни дає по суті таку саму поведінку, але не обов'язково дає той самий період. Розглянемо, наприклад,
... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
та його відображення
... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
Якщо ми вважаємо, що наступне покоління буде вироблятися на півдорозі між символами:
... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
... 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 ...
... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
... 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 ...
то обидва змістили б положення на 3,5 елемента. Однак ми не вважаємо, що наступне покоління вироблятиметься з таким зміщенням напівелементу, тому одне округлення до 4-елементного зсуву дає період 15, а інше - до 3-елементного зсуву, даючи період з 5.
З цієї причини ми вважаємо асиметричну струну та її відображення виразними, навіть незважаючи на те, що цикли в певному сенсі ізоморфні. Звичайно, якщо вони складають частину одного і того ж циклу, то він вважається лише одним циклом.
За цих обмежень трохи математики може показати, що насправді існує кінцева кількість циклів Діффі з будь-яким заданим кінцевим періодом. Більше того, кожна нескінченна струна з кінцевим періодом є нескінченним повторенням скінченного рядка.
Зауважте, що рядки можуть бути більшими або коротшими за періоди. Наприклад, є рядок довжиною 5 з періодом 15 і рядок довжиною 15 з періодом 5. Усі рядки з періодом 19 мають довжину 9709.
Завдання
Враховуючи таке число n
, що n більше 1 за допомогою стандартних методів введення, визначте кількість різних циклів Diffy з періодом точно n
.
(Здається, що в літературі 0
часто не вважається періодичною грою Diffy. Оскільки це сіра зона, я не прошу вас вирішити n = 1
)
Це код-гольф , тому мета - мінімізувати кількість байтів у вихідному коді.
Випробування
2 -> 0
3 -> 1
4 -> 0
5 -> 1
6 -> 1
7 -> 3
8 -> 0
9 -> 4
10 -> 4
11 -> 3
12 -> 5
13 -> 5
14 -> 24
15 -> 77
16 -> 0
17 -> 259
18 -> 259
19 -> 27
20 -> 272
21 -> 811
22 -> 768
23 -> 91
24 -> 340
25 -> 656
Підказки
Усі періодичні ігри, що містять періодичні дії, містять лише нуль та одну константу, це означає, що кожна періодична гра буде ізоморфною для якоїсь гри, що складається лише з нулів та одиниць.
010001->111001->000101->100111->010100->011110->010001
і 110110->101101->011011->110110
виразними?