이상한 꿈

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

요약
상자에서 앞으로 한 번, 뒤로 한 번 접시를 골라 기록한 수의 곱이 k로 나누어떨어지는 경우의 수를 l로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

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

문제

두미트루(Dumitru)는 아주 이상한 꿈을 꾸었다. 문이 잠긴 방 안에 갇혀 있었는데, 그 방에는 상자가 nn개 있고 각 상자에는 접시가 정확히 mm개씩 들어 있었다. 각 접시에는 11 이상의 정수가 하나씩 적혀 있다. 방에는 두 정수 kk와 ll이 적힌 쪽지가 있었고, 다음 작업을 요구했다.

  • 1단계: 첫 번째 상자에서 접시를 하나 골라 그 접시에 적힌 수를 공책에 적고, 그 접시의 수를 11로 바꾼 뒤 다시 상자에 넣는다. 이어서 같은 방식으로 두 번째 상자, 세 번째 상자, …\dots, nn번째(마지막) 상자까지 차례대로 각 상자에서 접시를 하나씩 골라 그 수를 공책에 적고, 그 접시의 수를 11로 바꾼 뒤 상자에 되돌려 놓는다.
  • 2단계: 그다음 같은 방식으로 n−1n-1번째 상자, n−2n-2번째 상자, …\dots, 두 번째 상자까지(양 끝 포함) 차례대로 각 상자에서 접시를 하나씩 골라 그 수를 공책에 적고, 그 접시의 수를 11로 바꾼 뒤 상자에 되돌려 놓는다.

위 방식으로 접시를 고르는 방법들 중에서, 공책에 적힌 모든 수의 곱이 kk로 나누어떨어지는 서로 다른 방법의 수를 TT라 하자. TT가 매우 클 수 있으므로, TT를 ll로 나눈 나머지를 구하여라.

입력

첫째 줄에 두 정수 nn과 mm이 공백 하나로 구분되어 주어진다. 둘째 줄에 두 정수 kk와 ll이 공백 하나로 구분되어 주어진다. 이어서 nn개의 줄이 주어지며, 각 줄에는 공백으로 구분된 mm개의 정수가 있다. 첫 번째 줄은 첫 번째 상자에 들어 있는 접시들에 적힌 mm개의 수, 두 번째 줄은 두 번째 상자의 수들, …\dots 과 같은 식으로 이어진다.

출력

TT를 ll로 나눈 나머지를 정수 하나로 출력한다.

제한

  • 3≤n≤2003 \le n \le 200
  • 3≤m≤10 0003 \le m \le 10\,000
  • 2≤k≤200 0002 \le k \le 200\,000
  • 2≤l≤30 0002 \le l \le 30\,000
  • 접시에 적힌 수는 11 이상 1 000 0001\,000\,000 이하의 정수이다.

설명

첫 번째 예시에서는 공책에 적힌 수들의 곱이 1212로 나누어떨어지도록 접시를 고르는 방법이 정확히 1212가지 있다. 두 가지 점에 주의해야 한다.

  • 어떤 상자에서 1단계와 2단계에 같은 접시를 고르면, 1단계에서 그 접시의 수가 이미 11로 바뀌었으므로 2단계에 공책에 적히는 값은 11이 된다.
  • 고른 접시들의 값 집합이 같더라도, 고른 접시의 인덱스 조합이 다르면 서로 다른 방법으로 센다.

예제3

  1. 예제 1

    입력
    3 3
    12 100
    5 2 1
    2 1 2
    3 7 4
    
    예상 출력
    12
    
  2. 예제 2

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

    입력
    3 3
    4 1000
    1 1 1
    2 2 2
    1 1 1
    
    예상 출력
    54