계산기

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

요약
X=0에서 출발해 [+]는 2 더하기, [-]는 2 빼기, [*]는 2 곱하기, [/]는 2로 나눈 몫을 적용하며 99번 이내에 X를 N으로 만들고, 불가능하면 -1을 출력한다.
난이도

어려움10점 중 9점

유형
이분 탐색, 수학, 비트 연산, 구현
정답자
아직 제출이 없습니다

문제

승주는 과제로 계산기를 만들고 있습니다.

계산기는 아직 미완성이므로 기능이 많지 않습니다.

계산기는 하나의 정수 X를 가지며, 총 4개의 버튼이 있습니다. 버튼의 기능은 아래와 같습니다.

  • [+] : X에 2를 더합니다.
  • [-] : X에서 2를 뺍니다.
  • [*] : X에 2를 곱합니다.
  • [/] : X를 2로 나눕니다. (나머지는 버립니다.)

버튼을 눌렀을 때 X가 음수가 되거나 263−12^{63}-1을 초과하는 경우 계산기가 폭발합니다.

승주는 계산기가 잘 작동하는지 테스트하고 싶습니다.

초기에 X가 0일 때, 정수 N이 주어지면 버튼을 잘 눌러 계산기를 폭발시키지 않고 X가 N이 되도록 해주세요.

입력

첫 번째 줄에 정수 N (1 ≤ N ≤ 101310^{13}) 이 주어집니다.

출력

첫 번째 줄에 버튼을 누른 횟수 K (0 ≤ K ≤ 99) 를 출력합니다. 누른 횟수를 최소화 하지 않아도 됩니다. 단, 누른 횟수가 99번을 넘으면 안됩니다.

만약 99번 안에 N을 만드는 방법이 존재하지 않는다면 첫 번째 줄에 "-1" 하나만 출력하고 더 이상 아무것도 출력하지 않아야 합니다.

두 번째 줄에는 버튼들을 누른 순서대로 공백을 사이에 두고 출력합니다. 버튼은 "[+]", "[-]", "[*]", "[/]" 중 하나이어야 합니다. 각 버튼의 기능은 지문에 서술되어 있습니다.

방법이 여러 가지인 경우 그 중 하나만 출력합니다.

힌트

X가 계산 과정에서 32bit 정수형의 범위를 초과할 수 있음에 주의하세요.

C/C++의 경우 long long 타입, Java의 경우 long 타입을 사용하는 것을 권장합니다.

예제2

  1. 예제 1

    입력
    14
    
    예상 출력
    5
    [+] [*] [*] [*] [-]
    
  2. 예제 2

    입력
    1
    
    예상 출력
    4
    [+] [*] [-] [/]