E133. Ожерелья

e-maxx algorithm original: C/C++ #algorithm #combinatorics #emaxx #math
Văn bản bài toán được dịch từ tiếng Nga theo ngôn ngữ giao diện. Mã không thay đổi.

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

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

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

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

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

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

Lời giải

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

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

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

-

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

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

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

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

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

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

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

,

переходит

в

,

— в

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

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

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

равную

, т.е.

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

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

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

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

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

по делителям

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

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

,

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

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

его

слагаемое

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

где

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

, что

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

Любое такое number

имеет вид:

, где

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

).

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

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

.

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

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

C# lời giải

bản nháp tự động, xem lại trước khi gửi
// C# draft for: Ожерелья
// Original e-maxx article has no compact code listing in the extracted PDF text.

C++ lời giải

đã khớp/gốc
// C++ source for: Ожерелья
// Compact code block was not extracted from this article.

Java lời giải

bản nháp tự động, xem lại trước khi gửi
// Java draft for: Ожерелья
// Original e-maxx article has no compact code listing in the extracted PDF text.

Материал разбит как Thuật toánическая Bài toán: изучить постановку, понять асимптотику и реализовать Thuật toán на выбранном языке.

Vacancies for this task

việc làm đang hoạt động with overlapping task tags are đã hiển thị.

Tất cả việc làm
Chưa có việc làm đang hoạt động.