정이면체군은 곱셈 연산 ∗가 정의된 집합 D이다. D의 원소는 모두 두 원소 a와 b로 만든다. 곱셈 기호는 거의 쓰지 않고 두 원소를 붙여 쓰거나 지수로 줄여 쓴다. 즉 a∗a는 aa 또는 a2으로 쓰고, a∗a∗b는 a2b1 또는 a2b로 쓴다.
정이면체군 D는 파라미터 m과 n을 받고, m≥2, n≥2이다. 이 군을 Dm,n으로 쓴다. Dm,n에서는 다음 세 관계가 성립한다.
am=a0=1,bn=b0=1,ba=am−1b
따라서 Dm,n의 원소는 모두 mn개다.
Dm,n={ajbk∣0≤j<m, 0≤k<n}={a0b0,a1b0,…,am−1b0,…,am−1bn−1}
m=7, n=2이면 D7,2는 다음 14개 원소로 이루어진다.
{a0b0,a1b0,a2b0,a3b0,a4b0,a5b0,a6b0,a0b1,a1b1,a2b1,a3b1,a4b1,a5b1,a6b1}
이 곱셈은 교환법칙이 성립하지 않아서 ba=ab이다. D7,2에서는 ba=a6b이다. 같은 문자의 거듭제곱은 ajak=a(j+k)modm, bjbk=b(j+k)modn으로 합쳐지지만, 두 문자가 섞이면 지수를 그냥 더할 수 없다.
(ajbk)(apbq)=a(j+p)modmb(k+q)modn
D7,2의 두 원소 a3b1과 a2b1을 올바르게 곱하는 과정은 다음과 같다. 먼저 가운데의 ba를 a6b로 바꾼다.
(a3b1)(a2b1)=(a3b0)(ba)(a1b1)=(a3b0)(a6b1)(a1b1)
a3a6=a(3+6)mod7=a2이므로 앞의 두 원소는 a2b1로 합쳐진다.
(a3b0)(a6b1)(a1b1)=(a2b1)(a1b1)
남은 곱도 같은 방법으로 정리한다.
(a2b1)(a1b1)=(a2b0)(ba)(a0b1)=(a2b0)(a6b1)(a0b1)=a8b2=a1b0
즉 (a3b1)(a2b1)=a1b0이다.
m과 n, 그리고 Dm,n의 두 원소 ajbk와 apbq가 주어졌을 때 곱한 결과를 구하는 프로그램을 작성하시오.
입력은 여러 개의 문제 세트로 이루어진다.
각 문제 세트의 첫째 줄에는 문제 ID와 m, n, p가 공백으로 구분되어 주어진다. 문제 ID는 대문자와 숫자로 이루어진 공백 없는 문자열이고, m과 n은 2 이상 1000 이하의 정수이며, p는 그 세트에 들어 있는 곱셈 문제의 개수다. 다음 p개 줄에는 곱셈 문제가 한 줄에 하나씩 주어지고, 각 줄에는 Dm,n의 원소 두 개가 공백으로 구분되어 주어진다. 원소는 a3b1처럼 문자 a, 지수, 문자 b, 지수를 이어 붙인 형식이고 지수에 앞자리 0은 붙지 않는다.
한 문제 세트가 끝나면 바로 다음 문제 세트가 이어진다. 문제 ID가 ZZ인 줄은 입력의 끝을 뜻하고, 그 줄의 나머지 값은 무시한다.
각 곱셈 문제마다 한 줄에 다음 형식으로 출력한다.
ProblemID id: ajbk * apbq = arbs
id는 그 문제 세트의 문제 ID, ajbk와 apbq는 입력으로 주어진 두 원소를 입력에 적힌 그대로 옮긴 것, arbs는 두 원소를 곱한 결과다. 결과의 지수는 0≤r<m, 0≤s<n을 만족하는 값으로 적고, 콜론 뒤와 *, = 양옆에는 공백을 하나씩 둔다.