고려 순열 정수의를 1
, ..., n
등이 하나 n = 6
:
[5,2,4,3,6,1]
순열을에서 [1,2,3,4,5,6]
로의 매핑으로 보는 경우 순열 [5,2,4,3,6,1]
을 분리 된 주기로 분리 할 수 있습니다 . 사이클은 서로 매핑되는 요소의 하위 집합입니다. 예를 들어에 1
매핑되고 5
에 6
매핑되고에 다시 매핑됩니다 1
. 따라서 한주기는입니다 [1,5,6]
. 다른주기는 [2]
및 [3,4]
입니다. 따라서이 순열 의주기 수 는 3
입니다.
일반적으로 순열의주기는 고유하며 (순서대로), 순열의주기 수 n
는에서 1
까지 다양 합니다 n
.
도전
비어 있지 않은 순열이 주어지면주기 수를 출력하십시오.
입력에 의해 형성된 배열 n
의 정수 1
, 2
, ..., n
, 여기서 n > 0
. 각 정수는 정확히 한 번 발생합니다. 표시되는 순서는 위의 예와 같이 순열을 정의합니다.
배열 대신 목록, 숫자 사이에 구분 기호가있는 문자열, 각 숫자에 대한 별도의 입력 또는 합리적인 항목을 사용할 수 있습니다.
크기의 순열의 n
경우 1 기반 정수 세트 대신 1
...을 n
사용하여 0 기반 세트 0
..., n-1
. 그렇다면 답변에 기재하십시오.
코드가 작동합니다 n
까지 20
적절한 시간에, 적은 일분 이상의 말한다.
코드 골프. 모든 내장이 허용됩니다.
테스트 사례
이것은 1 기반의 배열 입력을 가정합니다.
[1] -> 1
[3,2,1] -> 2
[2,3,4,5,1] -> 1
[5,2,4,3,6,1] -> 3
[8,6,4,5,2,1,7,3] -> 2
[4,5,11,12,7,1,3,9,10,6,8,2] -> 1
[4,2,5,11,12,7,1,3,9,10,6,8] -> 5
[5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3
[14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7
관련
이 관련 문제 는 순열의 수가 아니라 순열의 실제주기를 요구합니다. 사이클 수만 요구하면 실제 사이클 생성을 회피하는 알고리즘이 짧아 질 수 있습니다.
1
, ..., n
그 순서로 설정된 경우 예라고 생각합니다 . 맵핑이 입력이 될 수있는 방법을 명확히 할 수 있습니까? 데이터 구조입니까?
dict
입니다. {1: 2, 2: 1}
대신 입력으로 사용 하고 싶습니다 [2, 1]
.