Description
来玩一个蛋疼的游戏, 汗落塔:
我们知道标准汉诺塔的玩法是,有3根柱子把n个盘子从最左边的柱子A,移动到最右边的柱子C;移动的过程中必须保证大盘子不能在小盘子的上面,因此当
n=1时,步数s=1;
n=2时,步数s=3;
n=3时,步数s=7;
......
现在为了让它变得蛋疼,我们禁止盘子直接从A移动到C(从C直接移动到A)...新游戏的名字叫汗落塔- -.
那么在新的规则下当盘子数为n时,需要多少步才能把盘子从最左边A移动到最右边C.
Input
多组数据,每组一个n,(1<=n<= 10^6),读到-1时结束
Output
每组输出一个步数s mod 100000007.
Sample Input
0
1
2
-1
Sample Output
0
2
8
解题思路:
如果要把n个盘子从A移动到C,可以这样做,先把n-1个盘子移到C,再把最下面的盘子移到B,从C再把n-1个盘子移回A,把B上的一个盘子移到C,再把A上的n-1个盘子移到C,就完成了。用递归式写就是F(n) = F(n-1)+1+F(n-1)+1+F(n-1)=3*F(n-1)+2,求解得F(n)=3^n-1。
#include<iostream>
using namespace std;
const int M = 100000007;
const long long INF = 1000000000;
int fastPow(int n)
{
long long result = 1;
long long pow = 3;
while(n!=0)
{
if(n&1)
result = result*pow;
n >>= 1;
pow *= pow;
if(result>=INF)
result %= M;
if(pow>=INF)
pow %=M;
}
return result%M;
}
int main()
{
int n;
while(cin>>n){
if(n==-1)
break;
cout<<fastPow(n)-1<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s