题目大意:经典汉诺塔问题的变形,现在给定四根柱子的汉诺塔,要求回答给定的初始塔高度,移动到到一根柱子所需要的操作次数。

思路分析:首先分析三根柱子的汉诺塔:将第2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言个盘子从2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_02柱通过三根柱子移动到2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言_03柱,然后将最大的移动到2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_算法_04柱,最后又将2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言个盘子通过三根柱子移动到2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_算法_04柱。在这个过程中的操作次数为2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_07

那么我们继续分析四根柱子的汉诺塔:

1、从​​A​​​借助​​C、D​​​将2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_算法_08个盘子移动到​​​B​​​上;
2、将第2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_09个盘子移动到​​​C​​​上;
3、将第2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_高精度算法_10个盘子移动到​​​D​​​上;
4、将第2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_09个盘子移动到​​​D​​​上;
5、从​​​B​​​借助​​A、C​​​将2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_算法_08个盘子全部移动到​​​D​​上。

以上是我们的基本思路。但是这并不是最优解。在盘子较少时是显然成立的,但盘子增多时,那些多余的只有一个盘子的柱子是可以加以利用的。因此我们需要一个更合理的算法:(参考四柱加强版汉诺塔HanoiTower)

1、用2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_13柱汉诺塔算法把A柱上部分的2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_14个碟子通过C柱和D柱移到B柱上【2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_15步】;
2、用2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言_16柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上【2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言_17步】(参照上述三柱时的情况);
3、用2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_13柱汉诺塔算法把B柱上的2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_19个碟子通过A柱和C柱移到D柱上【2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_20步】;
4、依据上边规则求出所有2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_最小值_21)情况下步数2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言_22,取最小值得最终解。

因此可得状态转移方程:2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_开发语言_23

但是这题还没完,数据范围要求我们不得不使用高精度算法。赛时没有考虑到高精度的问题。。。。。所以2021 ICPC 江西省大学生程序设计竞赛(正式赛)F.Four Column Hanoi Tower 线性递推、高精度_c语言_24牛逼。。。。

ans = [0 for i in range(10005)]
a = [0 for i in range(10005)]

def solve():
n = int(input())
print(ans[n])

def init():
ans[1], ans[2], ans[3] = 1, 3, 5
a[2], a[3] = 4, 8
cnt = 2
for i in range(4, 10001):
ans[i] = ans[i - cnt] * 2 + a[cnt] - 1
a[i] = 2 * a[i - 1]
if(ans[i] > ans[i - cnt - 1] * 2 + a[cnt + 1] - 1):
cnt = cnt + 1
ans[i] = ans[i - cnt] * 2 + a[cnt] - 1


if __name__ == "__main__":
init()
t = int(input())
while t:
solve()
t -= 1