올킬 (All Kill)
시간 제한1초메모리 제한512 MB
각 문제의 아이디어가 나올 시각을 무작위로 정할 때, 모든 문제를 끝까지 코딩하고 각 문제를 연속된 구간으로 처리할 확률에 t^n을 곱한 값을 998244353으로 나눈 나머지를 구합니다.
문제
여러분은 친구와 함께 프로그래밍 대회에 참가했다. 대회에서 올킬(All Kill, 모든 문제를 푸는 것)은 하지 못했지만, 모든 문제를 풀 수 있었던 전략이 있었는지 궁금하다.
문제를 푸는 데는 생각 단계와 코딩 단계의 두 단계가 있다. 친구는 생각을 모두 맡고, 여러분은 코딩을 모두 맡는다.
각 문제마다 코딩하는 데 걸리는 시간을 정확히 알고 있다. 대회 중에 문제를 코딩하려면 친구가 먼저 그 문제의 풀이 아이디어를 얻어야 한다. 아이디어를 얻는 시점은 알 수 없으므로 다음과 같이 모델링한다. 각 문제에 대해, 친구는 대회 중 한 분을 균등 확률로 무작위 선택한 시점에 아이디어를 얻는다. 이 확률 변수들은 서로 독립이다. 한 번에 한 문제만 코딩할 수 있으므로, 어느 시점에든 여러 문제가 대기열에 쌓일 수 있다. 항상 번호가 가장 작은 문제부터 코딩한다. 1분 단위로 진행하기 때문에, 더 큰 번호의 문제를 끝내기 전에 더 작은 번호의 문제 아이디어를 친구가 얻으면 그 문제로 바꾼다. 문맥 전환은 사람의 뇌에도 비용이 큰 작업이라 가능한 피하고 싶다.
매 분은 다음 순서로 진행된다.
- 아직 아이디어가 없는 각 문제에 대해, 친구는 의 확률로 아이디어를 얻는다. 같은 분에 여러 문제의 아이디어를 얻을 수 있다.
- 아직 코딩 시간이 남아 있고 아이디어를 얻은 문제 중 번호가 가장 작은 것을 골라 다음 1분 동안 코딩한다. 해당하는 문제가 없으면 아무것도 하지 않는다.
다음 두 사건이 함께 일어날 확률을 구하라.
- 대회가 끝나기 전에 모든 문제의 코딩을 마친다.
- 각 문제를 코딩한 시간이 연속된 구간을 이룬다.
이 확률을 , 문제 수를 , 대회 시간(분)을 라 하자. 은 정수임을 보일 수 있다.
입력
첫째 줄에 공백으로 구분된 두 정수 ()과 ()가 주어진다. 은 문제 수이고 는 대회 시간(분)이다.
다음 개의 줄에는 각각 정수 ()가 하나씩 주어진다. 이는 문제를 순서대로 코딩하는 데 걸리는 시간(분)이다. 이 시간들의 합은 이하이다.
출력
의 값을 한 정수로 출력한다. 여기서 는 두 사건이 함께 일어날 확률이다. 998,244,353은 큰 소수이다.