
토벤머리 용사는 자신이 가장 아끼는 장비 아이템의 스타포스를 강화하던 중 가장 효과적으로 스타포스를 진행하는 방법이 궁금해졌다.
아이템은 이상 이하의 정수 값 레벨을 갖는다. 아이템의 초기 레벨은 이다.
이제 스타포스 강화의 진행 과정을 살펴보자. 레벨 ()의 아이템을 강화하기 위해서는 먼저 의 비용을 지불해야 한다. 이후에는 다음 중 하나의 이벤트가 랜덤하게 발생한다:
- 각 에 대해, 의 확률로 강화에 실패하여 레벨이 에서 로 감소한다.
- 각 에 대해, 의 확률로 강화에 성공하여 레벨이 에서 로 증가한다.
편의상, 이라고 하자. 이다. 즉, 강화 시에는 위의 가지 이벤트 중 정확히 하나의 이벤트가 발생한다.
강화를 시도하기 직전마다 최대 한 개의 하락 방지 쿠폰을 구입할 수 있는데, 이 쿠폰은 사용 직후의 강화에만 적용된다. 레벨 ()의 아이템을 강화하기 직전 구입할 수 있는 쿠폰은 다음과 같이 가지가 있다:
- 각 에 대해, 의 비용을 지불하여 하락 방지 쿠폰을 구입할 수 있다. 이 쿠폰은 강화에 실패하여 레벨이 로 감소하는 이벤트가 발생할 경우, 아이템의 레벨을 로 바꾼다. 즉, 강화에 실패하더라도 레벨이 이하가 되지 않도록 보장해 준다.
강화 비용과 강화 이벤트의 확률, 쿠폰의 비용, 그리고 목표 레벨 이 주어질 때, 최적의 전략을 사용하여 레벨 의 아이템을 레벨 으로 강화하기 위한 비용의 기댓값의 최솟값을 구하시오.
입력 형식
첫 줄에 테스트 케이스의 수를 나타내는 양의 정수 가 주어진다. 그다음 줄부터 각 테스트 케이스에 대한 정보가 주어진다.
- 각 테스트 케이스의 첫 줄에 최대 레벨을 나타내는 정수 이 주어진다.
- 그다음 줄에 강화 비용을 나타내는 개의 정수 이 공백으로 구분되어 차례대로 주어진다.
- 이어지는 개의 줄의 ()번째 줄에는 레벨 의 강화에서 구입할 수 있는 하락 방지 쿠폰의 가격을 나타내는 개의 정수 이 공백으로 구분되어 차례대로 주어진다.
- 이어지는 개의 줄의 ()번째 줄에는 레벨 의 강화에서 발생하는 이벤트의 확률의 배의 값을 나타내는 개의 정수 이 공백으로 구분되어 차례대로 주어진다.
입력 제한
각 테스트 케이스에서의 은 이상 이하이며, 모든 테스트 케이스에서의 의 합은 이하이다.
각 테스트 케이스 안에서 모든 이상 이하인 에 대해,
을 만족한다.
출력 형식
각 테스트 케이스마다 한 줄에 하나씩 레벨 의 장비 아이템을 레벨 으로 강화하기 위한 비용의 기댓값의 최솟값을 출력한다.
정답과 상대 오차가 이하라면 정답으로 인정된다.
예제 1
입력
1 1 3 0 1000000
출력
3
예제 2
입력
2 2 8 11 4 0 990000 10000 660000 0 340000 2 8 11 5 0 990000 10000 660000 0 340000
출력
51.6764705882 54.5008655511
예제 3
입력
1 3 291 447 992 8703 250915 310205 0 1000000 0 0 287837 0 712163 0 103122 367022 0 529856
출력
3626.412107746
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 5점
종류 2: 11점
종류 3: 28점
종류 4: 13점
종류 5: 43점
모든 입력 케이스가 주어진다.
해설
최선의 전략을 사용했을 때, 레벨 의 장비를 레벨 으로 강화하는 비용의 기댓값을 라고 합시다.
레벨이 일 때에 하락방지쿠폰 을 구매하는 상황을 가정합시다. 편의상, 쿠폰을 구매하지 않는 경우는 이라고 합시다. 이 경우, 다음과 같은 부등식을 얻습니다:
위 식은 에 대한 선형 결합과 상수에 대한 부등식 꼴이며, 최적의 에 대해 등호가 성립할 것입니다.
따라서, , 의 부등식과 함께 linear programming 문제를 해결하면, 의 최댓값이 문제의 정답이 됩니다. 이는 NYPC 채점 시스템에서 지원하는 scipy.optimize.linprog 라이브러리 등을 사용하여 쉽게 구현할 수 있습니다.