만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

랜덤 소트 2

시간 제한2초메모리 제한512 MB

요약
크기가 10 이하인 순열이 증가 순서가 될 때까지 무작위 교환을 반복할 때 필요한 교환 횟수의 기댓값을 구한다.
난이도

보통10점 중 7점

유형
확률, 동적 계획법, 수학, 행렬
정답자
아직 제출이 없습니다

문제

랜덤 소트는 크기가 NN인 순열 PP를 다음 알고리즘으로 정렬하는 방법이다.

function random_sort(permutation P) {
	swaps = 0;
	while (not sorted P) {
		(i, j) = random pair (1 <= i < j <= N)
		swap(P[i], P[j])
		swaps = swaps + 1;
	}
	return swaps;
}

random pair는 1≤i<j≤N1 \le i < j \le N을 만족하는 쌍 (N2)\binom{N}{2}개 중 하나를 매번 독립적으로, 같은 확률로 고른다. PP가 오름차순이 되면 반복을 멈추고 그때까지 센 교환 횟수를 반환한다.

순열 PP가 주어졌을 때 random_sort가 반환하는 값의 기댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 순열의 크기 NN (2≤N≤102 \le N \le 10)이 주어진다.

둘째 줄에 순열 P1,P2,…,PNP_1, P_2, \dots, P_N이 공백으로 구분되어 주어진다. 11부터 NN까지의 정수가 각각 정확히 한 번씩 나타난다.

출력

random_sort가 반환하는 값의 기댓값을 소수점 아래 일곱째 자리까지 출력한다. 여덟째 자리에서 반올림하고, 자리가 남으면 00으로 채운다. 입력 순열이 이미 오름차순이면 0.0000000을 출력한다.

예제4

  1. 예제 1

    입력
    2
    2 1
    
    예상 출력
    1.0000000
    
  2. 예제 2

    입력
    3
    2 1 3
    
    예상 출력
    5.0000000
    
  3. 예제 3

    입력
    4
    2 3 4 1
    
    예상 출력
    27.5000000
    
  4. 예제 4

    입력
    6
    2 5 1 3 4 6
    
    예상 출력
    781.0416667