만드는 중입니다

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

복사 붙여넣기

시간 제한3초메모리 제한1024 MB

요약
[0]에서 K번의 복사 붙여넣기로 만들 수 있는 파일 이름 중 주어진 이름 A가 사전순으로 몇 번째인지 998244353으로 나눈 나머지를 구합니다.
난이도

보통10점 중 7점

유형
조합론, 동적 계획법, 비트 연산
정답자
아직 제출이 없습니다

문제

할 일이 없어진 밍구는 복사 붙여넣기 놀이를 하고 있다. 이 놀이는 파일을 복사해서 붙여넣으며 생기는 파일 이름을 살펴보는 놀이이다.

파일의 이름은 0 이상 2w2^w 미만의 정수로 이루어진, 길이가 1 이상인 수열이다. 복사 붙여넣기 한 번은 다음 절차로 이루어진다.

  • 복사 과정: 폴더에 있는 모든 파일을 선택한다.
  • 붙여넣기 과정: 선택된 각 파일 SS에 대해 다음을 반복한다. 이때 새로 만든 파일은 선택되지 않는다.
    • SS의 뒤에 0을 추가한 이름을 가진 파일을 만든다. 단, 이미 같은 이름을 가진 파일이 있다면 만들지 않는다.
    • 0≤i<w0 \le i < w인 모든 ii에 대해, SS의 마지막 원소에 2i2^i를 XOR한 이름을 가진 파일을 만든다. 단, 이미 같은 이름을 가진 파일이 있다면 만들지 않는다.
  • 붙여넣기 과정이 끝나면, 선택된 모든 파일을 선택 해제한다.

예를 들어 w=2w = 2이고 폴더에 [0] 파일이 하나만 있을 때 복사 붙여넣기를 반복하면, 폴더의 내용은 다음과 같이 변한다.

  • 초기 상황: [0]
  • 1회: [0], [0, 0], [1], [2]
  • 2회: [0], [0, 0], [0, 0, 0], [0, 1], [0, 2], [1], [1, 0], [2], [2, 0], [3]

복사 붙여넣기 고수 밍구가 여러분에게 다음 문제를 냈다. 폴더에 [0] 파일이 하나만 있는 상황에서 KK번 복사 붙여넣기를 했을 때, 밍구가 준 파일 이름 AA가 사전 순으로 몇 번째에 위치하는지 구하는 것이다.

밍구를 위해 AA가 사전 순으로 위치하는 순서를 998 244 353으로 나눈 나머지를 구해 주자.

입력

첫째 줄에 정수 ww, KK가 공백으로 구분되어 주어진다. (1≤w≤601 \le w \le 60; 1≤K≤1000001 \le K \le 100000)

둘째 줄에 파일 이름 AA의 길이 NN이 주어진다. (1≤N≤1000001 \le N \le 100000)

셋째 줄에 AA의 ii번째 원소 AiA_i가 공백으로 구분되어 주어진다. (1≤i≤N1 \le i \le N; 0≤Ai<2w0 \le A_i < 2^w)

복사 붙여넣기를 KK번 한 후에 이름이 AA인 파일이 존재하는 경우에만 입력이 주어진다.

출력

사전 순으로 가장 앞서는 파일의 순서를 1이라고 할 때, AA가 사전 순으로 위치하는 순서를 998 244 353으로 나눈 나머지를 출력한다.

힌트

수열 a=[a1,a2,…,an]a = [a_1, a_2, \ldots, a_n]이 수열 b=[b1,b2,…,bm]b = [b_1, b_2, \ldots, b_m]보다 사전순으로 앞선다는 것은, 다음을 모두 만족하는 양의 정수 ii가 존재한다는 뜻이다.

  • ii보다 작은 모든 양의 정수 jj에 대해, aja_j와 bjb_j가 모두 존재하면서 aj=bja_j = b_j이다.
  • bib_i가 존재한다.
  • aia_i가 존재하지 않거나 ai<bia_i < b_i이다.

예제3

  1. 예제 1

    입력
    2 2
    3
    0 0 0
    
    예상 출력
    3
    
  2. 예제 2

    입력
    2 2
    1
    3
    
    예상 출력
    10
    
  3. 예제 3

    입력
    60 2024
    4
    998244353 1000000007 3141592653 2718281828
    
    예상 출력
    62474228