아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

행렬의 텐서곱

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

요약
양의 정수 행렬이 주어질 때, 어느 쪽도 1×1이 아닌 행렬 A, B의 텐서곱 A ⊗ B로 나타내는 서로 다른 방법의 수를 센다.
난이도

보통10점 중 7점

유형
수학, 정수론, 행렬, 완전 탐색
정답자
아직 제출이 없습니다

문제

두 행렬을 곱하는 또 다른 방법으로 텐서곱(크로네커 곱)이 있다.

크기가 p×qp \times q인 행렬 AA와 크기가 n×mn \times m인 행렬 BB를 생각하자. 단, AA와 BB는 모두 1×11 \times 1 행렬이 아니다.

AA와 BB의 텐서곱 A⊗BA \otimes B는 크기가 pn×qmpn \times qm인 행렬로, AA의 각 원소 aija_{ij}를 블록 aij⋅Ba_{ij} \cdot B로 바꾸어 얻는다.

예를 들면 다음과 같다.

A=[1234],B=[0567]A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \qquad B = \begin{bmatrix} 0 & 5 \\ 6 & 7 \end{bmatrix}

A⊗B=[0501067121401502018212428]A \otimes B = \begin{bmatrix} 0 & 5 & 0 & 10 \\ 6 & 7 & 12 & 14 \\ 0 & 15 & 0 & 20 \\ 18 & 21 & 24 & 28 \end{bmatrix}

일반적인 행렬의 곱과 달리, qq와 nn이 같아야 한다는 조건은 없다.

행렬 하나가 주어졌을 때, 이 행렬을 텐서곱 A⊗BA \otimes B로 나타내는 서로 다른 방법의 수를 구하는 프로그램을 작성하시오. 여기서 AA와 BB는 모든 원소가 양의 정수인 행렬이며, 둘 다 1×11 \times 1 행렬이 아니다. 두 방법은 행렬 AA 또는 행렬 BB가 (크기가 다르거나 어떤 원소가 다르거나 하여) 서로 다를 때 다른 것으로 센다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다.

각 테스트 케이스의 첫째 줄에는 행렬의 크기 rr과 cc가 주어진다. 이어지는 rr개의 줄에는 각 줄마다 행렬의 한 행을 이루는 cc개의 정수가 주어진다.

rr과 cc는 500500 이하이고, 행렬의 각 원소는 11 이상 6553665536 이하의 정수이다.

입력의 마지막 줄에는 00이 두 개 주어지며, 이는 입력의 끝을 의미한다.

출력

각 테스트 케이스마다, 입력으로 주어진 행렬을 텐서곱 A⊗BA \otimes B로 나타내는 서로 다른 방법의 수를 한 줄에 하나씩 출력한다.

예제4

  1. 예제 1

    입력
    6 6
    1 1 1 2 2 2
    1 1 1 2 2 2
    1 1 2 2 2 4
    3 3 3 4 4 4
    3 3 3 4 4 4
    3 3 6 4 4 8
    2 2
    3 6
    4 9
    2 4
    15 18 30 36
    20 24 40 48
    0 0
    
    예상 출력
    1
    0
    4
    
  2. 예제 2

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

    입력
    2 6
    1 1 2 2 3 3
    1 1 2 2 3 3
    0 0
    
    예상 출력
    4
    
  4. 예제 4

    입력
    4 4
    1 1 2 2
    1 1 2 2
    3 3 4 4
    3 3 4 4
    0 0
    
    예상 출력
    3