고려 순열 정수의를 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].