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

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

배열 분할

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

요약
N행 M열 배열을 한 변이 1이 될 때까지 4등분하고 남은 띠 길이별 개수를 1234567891로 나눈 나머지로 출력합니다.
난이도

보통10점 중 7점

유형
분할 정복, 재귀, 조합론, 수학
정답자
아직 제출이 없습니다

문제

2차원 배열을 분할 정복으로 처리하면 배열은 점점 작은 조각으로 쪼개진다. 이 문제는 마지막에 남는 조각의 모양과 개수를 센다.

크기가 N×MN \times M인 배열은 크기가 최대한 비슷한 네 개의 배열로 나뉜다. 정확히는 ⌊N/2⌋×⌊M/2⌋\lfloor N/2 \rfloor \times \lfloor M/2 \rfloor, ⌈N/2⌉×⌊M/2⌋\lceil N/2 \rceil \times \lfloor M/2 \rfloor, ⌊N/2⌋×⌈M/2⌉\lfloor N/2 \rfloor \times \lceil M/2 \rceil, ⌈N/2⌉×⌈M/2⌉\lceil N/2 \rceil \times \lceil M/2 \rceil 크기의 네 배열이다. ⌊x⌋\lfloor x \rfloor는 xx의 소수점 이하를 버린 값이고, ⌈x⌉\lceil x \rceil는 올린 값이다. 예를 들어 4×54 \times 5 배열은 2×22 \times 2 배열 두 개와 2×32 \times 3 배열 두 개로 나뉘고, 5×55 \times 5 배열은 2×22 \times 2, 3×23 \times 2, 2×32 \times 3, 3×33 \times 3 배열 네 개로 나뉜다.

지금 보고 있는 배열의 두 변 중 하나라도 길이가 1이면 그 배열은 더 나누지 않고 그대로 남긴다. 그래서 분할을 끝까지 진행하면 처음 배열은 여러 개의 1×K1 \times K 배열로 남는다. K×1K \times 1 배열은 돌리면 1×K1 \times K 배열이므로 같은 종류로 센다.

NN과 MM이 주어진다. 분할을 모두 끝낸 뒤 남는 1×K1 \times K 배열이 몇 종류인지, 그리고 각 종류의 KK와 그 개수가 얼마인지 구하라.

입력

첫 줄에 테스트 케이스의 수 TT (1≤T≤10 0001 \le T \le 10\,000)가 주어진다.

이어지는 TT개의 줄에 각각 배열의 처음 크기 NN과 MM (1≤N,M≤10181 \le N, M \le 10^{18})이 공백 하나로 구분되어 주어진다.

출력

각 테스트 케이스마다 먼저 분할이 끝난 뒤 남는 1×K1 \times K 배열의 종류 수 CC를 한 줄에 출력한다.

이어지는 CC개의 줄에 각 종류의 KK와 그 종류의 개수를 공백 하나로 구분해 출력한다. KK는 오름차순으로 출력한다. 개수는 매우 커질 수 있으므로 1,234,567,891로 나눈 나머지를 출력한다. 나머지가 0이 되는 종류도 CC에 포함하고 그대로 출력한다.

테스트 케이스 사이에 빈 줄을 넣지 않는다.

예제2

  1. 예제 1

    입력
    3
    4 4
    4 5
    5 5
    
    예상 출력
    1
    1 16
    2
    1 12
    2 4
    2
    1 13
    2 6
    
  2. 예제 2

    입력
    4
    1 1
    1 5
    7 1
    2 3
    
    예상 출력
    1
    1 1
    1
    5 1
    1
    7 1
    2
    1 2
    2 2