XDOJ1170 - 蛋疼的游戏

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;
}


你可能感兴趣的:(XDOJ1170 - 蛋疼的游戏)