만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

올킬 (All Kill)

시간 제한1초메모리 제한512 MB

요약
각 문제의 아이디어가 나올 시각을 무작위로 정할 때, 모든 문제를 끝까지 코딩하고 각 문제를 연속된 구간으로 처리할 확률에 t^n을 곱한 값을 998244353으로 나눈 나머지를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 확률
정답자
아직 제출이 없습니다

문제

여러분은 친구와 함께 프로그래밍 대회에 참가했다. 대회에서 올킬(All Kill, 모든 문제를 푸는 것)은 하지 못했지만, 모든 문제를 풀 수 있었던 전략이 있었는지 궁금하다.

문제를 푸는 데는 생각 단계와 코딩 단계의 두 단계가 있다. 친구는 생각을 모두 맡고, 여러분은 코딩을 모두 맡는다.

각 문제마다 코딩하는 데 걸리는 시간을 정확히 알고 있다. 대회 중에 문제를 코딩하려면 친구가 먼저 그 문제의 풀이 아이디어를 얻어야 한다. 아이디어를 얻는 시점은 알 수 없으므로 다음과 같이 모델링한다. 각 문제에 대해, 친구는 대회 중 한 분을 균등 확률로 무작위 선택한 시점에 아이디어를 얻는다. 이 확률 변수들은 서로 독립이다. 한 번에 한 문제만 코딩할 수 있으므로, 어느 시점에든 여러 문제가 대기열에 쌓일 수 있다. 항상 번호가 가장 작은 문제부터 코딩한다. 1분 단위로 진행하기 때문에, 더 큰 번호의 문제를 끝내기 전에 더 작은 번호의 문제 아이디어를 친구가 얻으면 그 문제로 바꾼다. 문맥 전환은 사람의 뇌에도 비용이 큰 작업이라 가능한 피하고 싶다.

매 분은 다음 순서로 진행된다.

  • 아직 아이디어가 없는 각 문제에 대해, 친구는 1대회 종료까지 남은 분 수\frac{1}{\text{대회 종료까지 남은 분 수}}의 확률로 아이디어를 얻는다. 같은 분에 여러 문제의 아이디어를 얻을 수 있다.
  • 아직 코딩 시간이 남아 있고 아이디어를 얻은 문제 중 번호가 가장 작은 것을 골라 다음 1분 동안 코딩한다. 해당하는 문제가 없으면 아무것도 하지 않는다.

다음 두 사건이 함께 일어날 확률을 구하라.

  • 대회가 끝나기 전에 모든 문제의 코딩을 마친다.
  • 각 문제를 코딩한 시간이 연속된 구간을 이룬다.

이 확률을 pp, 문제 수를 nn, 대회 시간(분)을 tt라 하자. p⋅tnp \cdot t^n은 정수임을 보일 수 있다.

입력

첫째 줄에 공백으로 구분된 두 정수 nn (1≤n≤1051 \le n \le 10^5)과 tt (1≤t≤1081 \le t \le 10^8)가 주어진다. nn은 문제 수이고 tt는 대회 시간(분)이다.

다음 nn개의 줄에는 각각 정수 xx (1≤x≤1031 \le x \le 10^3)가 하나씩 주어진다. 이는 문제를 순서대로 코딩하는 데 걸리는 시간(분)이다. 이 시간들의 합은 tt 이하이다.

출력

(p⋅tn) mod 998,244,353(p \cdot t^n) \bmod 998{,}244{,}353의 값을 한 정수로 출력한다. 여기서 pp는 두 사건이 함께 일어날 확률이다. 998,244,353은 큰 소수이다.

예제2

  1. 예제 1

    입력
    3 5
    1
    2
    1
    
    예상 출력
    60
    
  2. 예제 2

    입력
    5 5
    1
    1
    1
    1
    1
    
    예상 출력
    1296