1.问题描述
描述
Eli最近迷上了汉诺塔。她玩了传统汉诺塔后突发奇想,发明了一种新的汉诺塔玩法。
有A、B、C三个柱子顺时针放置,移动的次序为A仅可以到B,B仅可以到C、C仅可以到A。即只可顺时针移动,不可逆时针移动。当然,汉诺塔的普适规则是适用的:每次移动后,大金片必须在小金片的下面。
现在A柱子上有n\n 个金片。Eli想知道,她把这些全部移动到B或C,分别要多少次操作?
输入描述:
一个正整数n\n 。(n<10^7)(n<10
7
)
输出描述:
两个整数,分别代表A移到B和A移到C的最少操作数。由于该数可能过大,你需要对1000000007取模。
2.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n = -1;
int a = 2, b = 1;
int c = 2, d = 1;
int i;
scanf("%d", &n);
if(n <= 0)
{
return -1;
}
for(i=1; i<n; i++)
{
c = ((2 * a) % 1000000007 + (b + 2) % 1000000007) % 1000000007;
d = ((2 * a) % 1000000007 + 1) % 1000000007;
a = c;
b = d;
}
printf("%d, %d\n", b, a);
return 0;
}
3.编译源码
$ gcc -o test tes.c
4.运行及其结果
$ ./test
2
5, 7
网友评论