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

 

最后欢迎大家访问我的个人网站: 1024s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值