포크
시간 제한0.15초메모리 제한1024 MB
확률 P로 두 셸 중 하나에 키 입력이 무작위로 배분될 때, 고정된 N글자 문자열을 두 셸에 완성하는 키 입력 횟수의 기댓값 최솟값을 구합니다.
문제
루카는 파이썬 셸을 열고 os.fork()를 입력했고, 그 결과 두 번째 셸이 생겼다. 이후 루카가 키를 누를 때마다 그 키 입력은 두 셸 중 하나로 무작위로 간다. 각 셸에는 터미널에 표시되는 입력 문자열이 있고, 그 셸로 간 키 입력에 따라 문자열이 바뀐다. 루카는 터미널을 보고 있어서, 키를 누를 때 어느 셸의 입력 문자열이 바뀌었는지 안다.
그의 키보드에는 서로 다른 문자가 적힌 개의 키와 Backspace 키가 있다. 문자 키 입력이 셸로 가면 그 문자가 입력 문자열 끝에 붙는다. Backspace 입력이 셸로 가면 입력 문자열의 마지막 문자가 지워진다. 입력 문자열이 비어 있으면 아무 일도 일어나지 않지만, 루카는 Backspace가 그 셸로 갔다는 것을 여전히 본다. 각 키 입력은 확률 로 왼쪽 셸, 확률 로 오른쪽 셸에 간다.
루카는 서로 다른 개 문자로 이루어진 고정 문자열 을 두 셸에 모두 입력하려고 한다. 이미 왼쪽 셸에 올바른 문자 개를, 오른쪽 셸에 개를 입력했다. 따라서 두 셸의 문자열은 각각 , 이다.
예를 들어 , (문자열은 ab일 수 있다), , 인 경우를 생각하자. 가능한 사건 순서는 다음과 같다.
이 경우 두 셸에 ab를 입력하는 데 키 입력을 12번 했다.
잘못된 문자는 두 셸 중 하나에 들어간 문자 가운데, 전체 문자열을 두 셸에 모두 입력하기 전에 반드시 지워야 하는 문자이다. 그런 문자만 잘못된 문자로 본다.
루카는 두 셸 중 적어도 한 곳에 잘못된 문자가 있을 때만 Backspace를 누르기로 했다. 또한 항상 잘못된 문자를 만드는 키는 누르지 않기로 했다. 루카는 키 입력 횟수의 기댓값이 가장 작은 전략을 알고 싶어 한다.
이 문제를 해결하는 프로그램 fork.cpp를 작성하라.
입력
표준 입력의 첫 번째이자 유일한 줄에 , , , 이 주어진다.
출력
표준 출력의 첫 번째이자 유일한 줄에 답을 출력한다. 답은 소수점 이하 12자리 이상의 정밀도로 출력한다. 다음과 같이 출력할 수 있다.
std::cout << std::setprecision(12) << ans << std::endl;
제한