#P2429. 2429 - 幂次计算

2429 - 幂次计算

题目描述

xx 开始,反复乘以 xx ,我们可以用 3030 次乘法计算得到 x31x^{31}

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

平方运算可以明显缩短乘法的计算次数。以下是 88 次计算得到 x31x^{31} 的算法:

x2=x×xx^2=x \times xx3=x2×xx^3=x^2 \times xx6=x3×x3x^6=x^3 \times x^3x7=x6×xx^7=x^6 \times xx14=x7×x7x^{14}=x^7 \times x^7x15=x14×xx^{15}=x^{14} \times xx30=x15×x15x^{30}=x^{15} \times x^{15}x31=x30×xx^{31}=x^{30} \times x

这不是计算 x31x^{31} 的最快方法。实际上有多种方法可以用 77 步运算得到结果。以下方法是其中之一:

x2=x×xx^2=x \times xx4=x2×x2x^4=x^2 \times x^2x8=x4×x4x^8=x^4 \times x^4x10=x8×x2x^{10}=x^8 \times x^2x20=x10×x10x^{20}=x^{10} \times x^{10}x30=x20×x10x^{30}=x^{20} \times x^{10}x31=x30×xx^{31}=x^{30} \times x

如果可以用除法,我们会发现有步数更少的方法计算出结果,比如:可以用六步运算(五次乘一次除)计算 x31x^{31}

x2=x×xx^2=x \times xx4=x2×x2x^4=x^2 \times x^2x8=x4×x4x^8=x^4 \times x^4x16=x8×x8x^{16}=x^8 \times x^8x32=x16×x16x^{32}=x^{16} \times x^{16}x31=x32÷xx^{31}=x^{32} \div x

这是计算 x31x^{31} 最有效的方法之一。

你的任务是编写一个程序,通过对给定的正整数 nn 进行从 xx 开始的乘法和除法运算,找到计算出 xnx^n 的最少运算次数。计算中出现的乘和除的值应该是 xx 的正整数幂。换句话说, x3x^{−3} 不应该出现。

输入

输入包含一个或多个测试数据(不超过 2020 组),每行包含一个整数 nn

nn 为正整数且小于或等于 10001000 ,输入 00 表示测试数据的读入结束。

输出

输出计算到 xxnn 所需的最小乘法或除法计算总次数,每个输出占 11 行。

样例

1
31
70
91
473
512
811
953
0
0
6
8
9
11
9
13
12

来源

POJ