Fractran

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

요약
분수 목록과 시작값이 주어질 때, 곱한 결과가 정수가 되는 첫 번째 분수를 계속 곱해 나가며 수열에 나타나는 2의 거듭제곱의 지수를 처음 m개 출력한다.
난이도

보통10점 중 7점

유형
시뮬레이션, 수학, 정수론, 구현
정답자
아직 제출이 없습니다

문제

주어진 분수 목록 f1,f2,…,fkf_1, f_2, \dots, f_k 와 시작 정수 NN 에 대한 "분수 게임"은 다음과 같이 진행한다. 현재 가지고 있는 정수(처음에는 NN)에, 곱한 결과가 정수가 되는 목록 중 가장 앞선 fif_i 를 곱한다. 그런 fif_i 가 하나도 없으면 게임을 멈춘다.

엄밀하게, 수열을 S0=NS_0 = N 으로 정의하고 Sj+1=fiSjS_{j+1} = f_i S_j 로 정의한다. 여기서 ii 는 1≤i≤k1 \le i \le k 범위에서 fiSjf_i S_j 는 정수이면서 f1Sj,…,fi−1Sjf_1 S_j, \dots, f_{i-1} S_j 는 모두 정수가 아닌 가장 작은 첨자이다.

예를 들어 여덟 개의 분수 f1=170/39f_1 = 170/39, f2=19/13f_2 = 19/13, f3=13/17f_3 = 13/17, f4=69/95f_4 = 69/95, f5=19/23f_5 = 19/23, f6=1/19f_6 = 1/19, f7=13/7f_7 = 13/7, f8=1/3f_8 = 1/3 과 N=21N = 21 로 시작하면 유한 수열 (21,39,170,130,190,138,114,6,2)(21, 39, 170, 130, 190, 138, 114, 6, 2) 가 만들어진다. 일반적으로 이 수열은 무한할 수도 있다.

분수 목록과 시작 정수가 주어질 때, 우리는 이 수열에 나타나는 22 의 거듭제곱에만 관심이 있다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 세 정수 mm, NN, kk 로 시작하며 1≤m≤401 \le m \le 40, 1≤N≤10001 \le N \le 1000, 1≤k≤1001 \le k \le 100 을 만족한다. 그 뒤에 kk 개의 분수 f1,…,fkf_1, \dots, f_k 가 이어지며, 각 분수는 분자를 먼저, 분모를 나중에 준다. 분자와 분모는 모두 10001000 보다 작은 양의 정수이고 서로소이다(최대공약수가 11). 마지막 테스트 케이스 뒤에는 00 하나가 온다.

출력

각 테스트 케이스마다 한 줄에 mm 개의 수 e1,…,eme_1, \dots, e_m 을 공백 하나로 구분하여 출력한다. 이때 2e1,…,2em2^{e_1}, \dots, 2^{e_m} 은 수열에 나타나는 22 의 거듭제곱 중 처음 mm 개이다. 수열의 처음 76543217654321 개 원소 안에 22 의 거듭제곱이 적어도 mm 개 존재한다고 가정해도 된다.

예제5

  1. 예제 1

    입력
    1 21 8 170 39 19 13 13 17 69 95 19 23 1 19 13 7 1 3
    20 2 14 17 91 78 85 19 51 23 38 29 33 77 29 95 23 77 19 1 17 11 13 13 11 15 2 1 7 55 1
    0
    
    예상 출력
    1
    1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
    
  2. 예제 2

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

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

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

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