각 친구가 싫어하는 한 명이 주어질 때, 무작위 초대 순서에서 초대를 수락하는 친구 수의 기댓값을 구한다.
보통6확률수학조합론아직 제출이 없습니다시간 제한2초메모리 제한512 MB강호가 친구 N명을 파티에 초대하려고 한다. 친구에게는 0번부터 N−1번까지 번호가 붙어 있다.
친구는 저마다 싫어하는 친구가 많아야 한 명이다. i번 친구가 싫어하는 친구의 번호는 Ai이고, Ai가 i와 같으면 i번 친구는 싫어하는 친구가 없다.
강호는 친구를 한 번에 한 명씩 초대한다. i번 친구는 Ai번 친구가 아직 초대를 받지 않았거나, 이미 초대를 받고 거절한 경우에만 초대를 승낙한다. 즉 Ai번 친구가 i번 친구보다 먼저 초대를 받고 승낙했다면, i번 친구는 초대를 거절한다.
초대하는 순서에 따라 승낙하는 친구의 수가 달라진다. 그래서 강호는 N!가지 순서 중 하나를 균등한 확률로 골라 그 순서대로 초대하기로 했다.
강호의 초대를 승낙하는 친구 수의 기댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 친구의 수 N (1≤N≤50)이 주어진다.
둘째 줄에 A0,A1,…,AN−1이 공백으로 구분되어 주어진다. (0≤Ai≤N−1)
초대를 승낙하는 친구 수의 기댓값을 소수점 아래 열째 자리까지 반올림해 한 줄에 출력한다. 뒤따르는 0도 생략하지 말고 소수점 아래를 정확히 10자리로 채워서 출력한다. 채점 데이터에는 정답이 반올림 경계에 놓이는 경우가 없다.
N=3이고 A0=0, A1=1, A2=1인 경우를 보자. 0번과 1번은 싫어하는 친구가 없고, 2번은 1번을 싫어한다. 초대 순서는 여섯 가지다. (1,0,2) 순서로 초대하면 1번과 0번은 승낙하지만 2번은 거절한다. (2,1,0) 순서로 초대하면 세 명 모두 승낙한다. 여섯 가지 순서를 모두 따져 보면 승낙하는 친구 수의 기댓값은 2.5다.