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

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

이진법이여, 안녕?

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

요약
피보나치 진법으로 주어진 두 수를 더한 뒤, 인접한 1이 없는 표준 표현으로 바꾸어 자리를 맞춰 출력한다.
난이도

보통10점 중 6점

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

문제

괴짜 계산광 모임이 수를 세는 멋진 새 방법을 발견했다. 이들은 평범한 십진수 대신 피보나치 진법(Fibonacci base) 을 사용한다. 이 진법의 수는 이진수처럼 00과 11의 나열로 표현되지만, 각 자리의 가중치가 22의 거듭제곱이 아니라 피보나치 수열의 원소이다. 이 수열은 F0=1F_0 = 1, F1=2F_1 = 2로 시작하며, n≥2n \ge 2에 대해 Fn=Fn−1+Fn−2F_n = F_{n-1} + F_{n-2}로 정의된다(즉 1,2,3,5,8,…1, 2, 3, 5, 8, \dots).

표현에서 가장 오른쪽 자리의 가중치가 F0F_0 이고, 왼쪽으로 갈수록 그다음 피보나치 수가 가중치가 된다. 예를 들어

1101001Fib=F0+F3+F5+F6=1+5+13+21=401101001_{\mathrm{Fib}} = F_0 + F_3 + F_5 + F_6 = 1 + 5 + 13 + 21 = 40

이다.

모든 정수는 이 진법으로 표현할 수 있지만, 그 방법이 유일하지는 않다. 예를 들어 4040은 10001001Fib10001001_{\mathrm{Fib}}로도 표현된다. 그러나 임의의 정수에 대해 11이 서로 이웃하지 않는 표현이 유일하게 존재하며, 이를 정규 표현(canonical representation) 이라 부른다. 예를 들어 4040의 정규 표현은 10001001Fib10001001_{\mathrm{Fib}}이다.

피보나치 진법으로 계산하는 컴퓨터를 만들기 위해, 피보나치 진법으로 주어진 두 수(반드시 정규 표현일 필요는 없다)를 더하는 프로그램을 작성하라.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 각 케이스는 한 줄이다. 각 줄에는 피보나치 진법으로 표현된 두 수 XX와 YY가 공백 하나로 구분되어 주어진다. 두 수는 각각 최대 4040자리이다. 입력의 끝은 파일의 끝(EOF)으로만 표시되며, 별도의 표식은 없다.

출력

각 테스트 케이스에 대해 다음 네 줄을 출력한다.

  1. 첫째 줄: XX의 정규 표현. 왼쪽을 공백으로 채워 정렬한다.
  2. 둘째 줄: 더하기 기호 + 다음에 YY의 정규 표현. 왼쪽을 공백으로 채워 정렬한다.
  3. 셋째 줄: 공백 두 칸 다음에, 합의 정규 표현과 같은 길이만큼 빼기 기호 -를 출력한다.
  4. 넷째 줄: 공백 두 칸 다음에 X+YX + Y의 정규 표현.

XX, YY, X+YX + Y의 가장 낮은 자리(가장 오른쪽 자리)가 같은 열에 오도록 XX와 YY의 왼쪽을 공백으로 채운다. 연속한 두 테스트 케이스의 출력 사이에는 빈 줄을 하나 넣는다.

예제2

  1. 예제 1

    입력
    11101 1101
    1 1
    
    예상 출력
       100101
    +   10001
      -------
      1001000
    
       1
    +  1
      --
      10
    
  2. 예제 2

    입력
    1101001 10001001
    
    예상 출력
       10001001
    +  10001001
      ---------
      101000101