E133. Ожерелья

e-maxx algorithm original: C/C++ #algorithm #combinatorics #emaxx #math
Il testo del problema è tradotto dal russo per la lingua selezionata. Il codice resta invariato.

Источник: e-maxx.ru/algo, страница PDF 429.

Problema "ожерелья" — это одна из классических комбинаторных задач. it is required посчитать количество

различных ожерелий из

бусинок, каждая из которых может быть покрашена в один из

цветов. При сравнении

двух ожерелий их можно поворачивать, но не переворачивать (т.е. разрешается сделать циклический сдвиг).

Soluzione

Решить эту задачу можно, используя лемму Бернсайда и теорему Пойа. [ Ниже идёт копия текста из этой статьи ] В этой задаче мы можем сразу find группу инвариантных перестановок. Очевидно, она будет состоять из перестановок:

Найдём явную формулу для вычисления

. Во-первых, заметим, что перестановки имеют такой вид, что в

-

ой перестановке на

-ой позиции стоит

(взятое по модулю

, если оно больше

). Если мы будем

рассматривать циклическую структуру

-ой перестановки, то увидим, что единица переходит в

,

переходит

в

,

— в

, и т.д., пока не придём в number

; для остальных elementов

выполняются похожие утверждения. Отсюда можно понять, что все циклы имеют одинаковую длину,

равную

, т.е.

("gcd" — наибольший общий делитель, "lcm" — наименьшее общее

кратное). Тогда количество циклов в

-ой перестановке будет равно просто

. Подставляя найденные значения в теорему Пойа, получаем Soluzione: Можно оставить формулу в таком виде, а можно её свернуть ещё больше. Перейдём от суммы по всем

к сумме только

по делителям

. Действительно, в нашей сумме будет много одинаковых слагаемых: если

не является делителем

,

то таковой делитель найдётся после вычисления

. Следовательно, для каждого делителя

его

слагаемое

учтётся несколько раз, т.е. сумму можно представить в таком виде:

где

— это количество таких чисел

, что

. Найдём явное выражение для этого количества.

Любое такое number

имеет вид:

, где

(иначе было бы

).

Вспоминая функцию Эйлера, мы находим, что количество таких

— это величина функции Эйлера

.

Таким образом,

, и окончательно получаем формулу:

C# soluzione

bozza automatica, rivedere prima dell'invio
// C# draft for: Ожерелья
// Original e-maxx article has no compact code listing in the extracted PDF text.

C++ soluzione

abbinato/originale
// C++ source for: Ожерелья
// Compact code block was not extracted from this article.

Java soluzione

bozza automatica, rivedere prima dell'invio
// Java draft for: Ожерелья
// Original e-maxx article has no compact code listing in the extracted PDF text.

Материал разбит как Algoritmoическая Problema: изучить постановку, понять асимптотику и реализовать Algoritmo на выбранном языке.

Vacancies for this task

offerte attive with overlapping task tags are mostrati.

Tutte le offerte
Non ci sono ancora offerte attive.