您的位置:首页 > 其它

FOJ 1036

2009-07-28 09:54 162 查看
四塔问题

“汉诺塔”,是一个众所周知的古老游戏。现在我们把问题稍微改变一下:如果一共有4根柱子,而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢?
为了编程方便,您只需要输出这个结果mod 10000的值。
Input
该题含有多组测试数据,每组一个正整数n。(0<n<=50000)
Output
一个正整数,表示把n个盘子从第1根柱子移动到第4根柱子需要的最少移动次数mod 10000的值。
Sample Input

15

Sample Output

129

解题思路:

n 1:0+2^0=1;
n 2: 1+2^1=3;
n 3: 3+2^1=5;
n 4: 5+2^2=9;
n 5: 9+2^2=13;
n 6: 13+2^2=17;
n 17+2^3=25;
n 8: 25+2^3=33;
n 9: 33+2^3=41;
n 10: 41+2^3=49;
由上式发现了算法

F(n) = F(n-1) + 2^k
并且发现 2^k 一共要循环使用上 k+1次,之后k++。
根据这个公式即可求出F(n)%10000的值是多少了。

#include <stdio.h>

long NumOfMove(int n);

int main()
{
long count;
int N;
//freopen("e://1036.txt","r",stdin);
while (scanf("%d",&N)!=EOF)
{
if (N == 1)
{
printf("1/n");
}
else
{
count = NumOfMove(N);
printf("%ld/n",count);
}
}
return 0;
}

long NumOfMove(int n)
{
int i;
long A,B=1;
int k=2;
int reminder=2;
int count=0;
for (i=2;i<=n;i++)
{
A=((B%10000)+reminder)%10000;
B = A;
count ++;
if (count == k)
{
reminder = (reminder*2)%10000;
count = 0;
k++;
}
}
return A;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: