FOJ 1036
2009-07-28 09:54
162 查看
四塔问题
解题思路:
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的值是多少了。
“汉诺塔”,是一个众所周知的古老游戏。现在我们把问题稍微改变一下:如果一共有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; }
相关文章推荐
- FOJ 1036 四塔问题
- FOJ 1036 四塔问题
- FOJ 1635 Commandos
- FOJ 1410 变位词
- FOJ 1011使用非KMP算法AC!!
- FOJ 1706 括号表达式
- FOJ 1481 环串
- FOJ 1068 An Interesting Set
- FZU 1036 四塔问题
- FOJ 1723 我就不信你能找得到
- FOJ 1409 文件压缩
- FOJ--1339--Calculator--解题报告
- FOJ--1490--五子棋--解题报告
- mysql做master/slave时当出现ERROR 1036 (HY000): Table is read only 的解决方法
- Foj 1881 三角形问题
- Foj 1205 小鼠迷宫问题
- FOJ 1207 半数集问题
- foj 1316 Tian Ji -- The Horse Racing
- foj 1973 How many stars
- FOJ 1018 Maximal Sum