거듭제곱 계산

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

요약
1000 이하의 n에 대해 곱셈과 나눗셈만 사용해 x^n을 만드는 데 필요한 최소 연산 수를 구하는 문제입니다.
난이도

보통10점 중 7점

유형
동적 계획법, 수학, 완전 탐색
정답자
아직 제출이 없습니다

문제

xx에 xx를 3030번 곱하면 x31x^{31}이 된다.

x2=x×x,x3=x2×x,x4=x3×x,…,x31=x30×xx^2 = x \times x,\quad x^3 = x^2 \times x,\quad x^4 = x^3 \times x,\quad \dots,\quad x^{31} = x^{30} \times x

만약 중간 결과를 제곱할 수 있다면, 88번의 연산만으로 x31x^{31}을 구할 수 있다.

x2=x×x,x3=x2×x,x6=x3×x3,x7=x6×x,x14=x7×x7,x15=x14×x,x30=x15×x15,x31=x30×xx^2 = x \times x,\quad x^3 = x^2 \times x,\quad x^6 = x^3 \times x^3,\quad x^7 = x^6 \times x,\quad x^{14} = x^7 \times x^7,\quad x^{15} = x^{14} \times x,\quad x^{30} = x^{15} \times x^{15},\quad x^{31} = x^{30} \times x

앞서 나온 계산 결과들을 서로 곱하는 방법까지 함께 쓰면 x31x^{31}을 77번의 연산으로 구할 수 있다.

x2=x×x,x4=x2×x2,x8=x4×x4,x10=x8×x2,x20=x10×x10,x30=x20×x10,x31=x30×xx^2 = x \times x,\quad x^4 = x^2 \times x^2,\quad x^8 = x^4 \times x^4,\quad x^{10} = x^8 \times x^2,\quad x^{20} = x^{10} \times x^{10},\quad x^{30} = x^{20} \times x^{10},\quad x^{31} = x^{30} \times x

이것이 곱셈만으로 x31x^{31}을 구하는 가장 효율적인 방법이다.

만약 나눗셈도 쓸 수 있다면 연산 횟수를 더 줄일 수 있다. x31x^{31}을 곱셈 55번과 나눗셈 11번으로 구할 수 있다.

x2=x×x,x4=x2×x2,x8=x4×x4,x16=x8×x8,x32=x16×x16,x31=x32÷xx^2 = x \times x,\quad x^4 = x^2 \times x^2,\quad x^8 = x^4 \times x^4,\quad x^{16} = x^8 \times x^8,\quad x^{32} = x^{16} \times x^{16},\quad x^{31} = x^{32} \div x

이것은 나눗셈이 곱셈만큼 빠를 때 x31x^{31}을 계산하는 가장 효율적인 방법이다.

xx에서 시작해 xnx^n을 만드는 데 드는 연산 횟수의 최솟값을 구하는 프로그램을 작성하시오. 문제에서 설명한 곱셈과 나눗셈만 사용할 수 있다. 모든 중간 결과는 항상 xx의 양의 거듭제곱이어야 한다. 즉 x−3x^{-3} 같은 것이 나와서는 안 된다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스는 한 줄로 이루어지며, 정수 nn이 주어진다. nn은 양의 정수이며 10001000보다 작거나 같다.

출력

각 테스트 케이스에 대해, xnx^n을 만드는 데 필요한 곱셈과 나눗셈의 최소 횟수를 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    8
    1
    31
    70
    91
    473
    512
    811
    953
    
    예상 출력
    0
    6
    8
    9
    11
    9
    13
    12