题意分析
汉诺塔问题,但是每个大小的圆盘都有两个且没有任何区别,求需要移动圆盘多少次才能完成它
解题思路
正常的汉诺塔每个大小只有一个圆盘,我们先从这个开始理解:
设nnn为大小种数,fif_ifi 为n=in=in=i时的最少次数:
n=1n=1n=1时,f1=1f_1=1f1 =1。n=2n=2n=2时,f2=3f_2=3f2 =3……这些数字是有规律的!通过观察可以得出fn=2n−1f_n=2^n-1fn =2n−1。
回到该问题,n=1n=1n=1时,f1=2f_1=2f1 =2。n=2n=2n=2时,f2=6f_2=6f2 =6……看起来不容易找到规律,但是如果观察前后项的关系,我们可以发现:
2×2+2=62 \times 2 +2=62×2+2=6,6×2+2=146 \times2+2=146×2+2=14,于是我们得出基础70pts70pts70pts解法(放在ACACAC代码第二个)。
没有ACACAC,观察数据范围,发现nnn可能达到200200200,至少要200200200位二进制才能承受的起200200200次的乘222,考虑高精度加法优化,得到第一个ACACAC代码(ACACAC代码第一个)。
虽然已经000毫秒了,且该代码在数据范围内已十分接近最优,但是为了水字数尊重一下这道题,我还是希望有神人能写快速幂之类的优化,公式放在这了,fn=2n+1−2f_n=2^{n+1}-2fn =2n+1−2,有优化方案的自取。
AC代码
100pts100pts100pts高精度加法递推:
70pts70pts70pts无高精度递推: