汉诺塔问题
试题描述
|
现在有围成一圈的三根柱子,初始时,A柱从底向上套有n个大小不等的盘子,B柱和C柱上没有盘子。现在可以做三种操作:1) 将A柱顶端的盘子移到B柱顶端 2) 将B柱顶端的盘子移到C柱顶端 3)将C柱顶端的盘子移到A柱顶端。除此之外,要求在移动的任意过程中,不得出现大盘在上,小盘在下的情况。请求出将n个盘子从A柱移到B柱最少需要多少次移动。 |
输入
|
仅一个整数N,含义如题所述。
|
输出
|
仅一个整数M,表示最少的移动次数对10000007取模。
|
输入示例
|
2
|
输出示例
|
5
|
其他说明
|
数据范围:1<=N<=10^6
|
#include <iostream> using namespace std; long long ac[1000001],ab[1000001],n; int main() { cin>>n; ac[1]=2; ab[1]=1; ab[2]=5; ac[2]=7; for(long long i=3;i<=n;i++) { ac[i]=(2*ac[i-1]+ab[i-1]+2)%10000007; ab[i]=(2*ac[i-1]+1)%10000007; } cout<<ab[n]; }