미니멀 백개먼
시간 제한1초메모리 제한128 MB
말이 한 개인 미니 백개먼에서 한 턴 쉬기, 시작으로 되돌아가기, 초과 이동 시 반사 규칙을 반영해 T턴 이내에 목표에 도달할 확률을 구하는 문제입니다.
문제
백개먼을 아주 단순하게 바꾼 1인용 변형 게임 “미니멀 백개먼”을 소개한다. 이 게임은 한 명의 플레이어가 주사위 하나와 말(플레이어의 토큰) 하나만으로 진행한다.
게임판은 번(출발점)부터 번(도착점)까지 번호가 매겨진 개의 칸이 한 줄로 놓인 형태다. 처음에 말은 출발점(칸 )에 놓이며, 목표는 말을 도착점(칸 )으로 옮기는 것이다. 매 턴마다 플레이어는 주사위를 굴리는데, 주사위는 부터 까지의 정수를 각각 같은 확률로 보여 주며, 말은 나온 수만큼 앞으로 나아간다.
말은 도착점을 지나칠 수 없다. 굴린 값이 말을 도착점 너머로 보내는 경우, 말은 도착점까지 간 뒤 초과한 칸 수만큼 도착점에서 되돌아온다. 예를 들어 말이 칸 에 있을 때 가 나오면, 도착점을 넘는 초과분이 이므로 말은 칸 로 간다. 다음 턴에는 다시 평소처럼 도착점을 향해 나아간다.
출발점과 도착점을 제외한 각 칸에는 다음 두 가지 특수 지시 중 하나가 있을 수 있다.
- 한 턴 쉬기: 말이 이 칸에 멈추면, 다음 턴에는 말을 움직일 수 없다.
- 출발점으로 돌아가기: 말이 이 칸에 멈추면, 말은 즉시 출발점(칸 )으로 돌아간다.
게임판의 구성(크기 과 특수 칸들의 위치)이 주어질 때, 주어진 턴 수 안에 게임을 성공(말이 도착점에 도달)할 확률을 구하시오.
입력
입력은 여러 개의 데이터셋으로 이루어진다. 각 데이터셋의 형식은 다음과 같다.
N T L B
Lose_1
...
Lose_L
Back_1
...
Back_B
은 도착점의 번호로 을 만족한다. 는 턴 수이며, 턴 안에 성공할 확률을 구해야 한다. 는 을 만족한다. 은 “한 턴 쉬기”로 표시된 칸의 개수로 을 만족한다. 는 “출발점으로 돌아가기”로 표시된 칸의 개수로 을 만족한다. 이 네 값은 공백으로 구분된다.
Lose 목록의 각 값은 “한 턴 쉬기” 칸의 번호로 값 을 만족하며, 서로 다르고 오름차순으로 주어진다. Back 목록의 각 값은 “출발점으로 돌아가기” 칸의 번호로 값 을 만족하며, 서로 다르고 오름차순으로 주어진다. 같은 번호가 Lose 목록과 Back 목록에 동시에 나오는 일은 없다.
입력의 끝은 공백으로 구분된 네 개의 으로 이루어진 줄로 표시된다.
출력
각 데이터셋에 대해, 주어진 턴 수 안에 게임을 성공할 확률을 소수점 아래 정확히 여섯 자리로 반올림하여 한 줄에 출력한다 (예: printf("%.6f")).