汉诺塔
2015-07-10 20:45
309 查看
汉诺塔(一)
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
现在请你计算出起始有m个金片的汉诺塔金片全部移动到另外一个针上时需要移动的最少步数是多少?(由于结果太大,现在只要求你算出结果的十进制位最后六位)
输入第一行是一个整数N表示测试数据的组数(0<N<20)
每组测试数据的第一行是一个整数m,表示起始时金片的个数。(0<m<1000000000)输出输出把金片起始针上全部移动到另外一个针上需要移动的最少步数的十进制表示的最后六位。样例输入
2 1 1000
样例输出
1 69375
// 算法 。。。。。快幂求模 汉诺塔 次数 即为 sum=2^n-1 n为 个数,sum 为次数
<span style="font-family:SimSun;font-size:18px;">#include <stdio.h> #define M 1000000 int main() { int n; scanf("%d",&n); while(n--) { long long m,a=2,sum=1; scanf("%lld",&m); while(m!=1) { if(m%2==0) { a=a*a; a=a%M; m/=2; } else { m--; sum=sum*a; sum%=M; } } printf("%lld\n",(sum*a-1)%M); } return 0; }</span>
相关文章推荐
- Android项目结构介绍
- Spring特性——事件驱动模型
- 【DP】 (ASC 44) Braess's Paradox
- Android API 翻译之 UsbDevice
- [LeetCode][Java] Implement strStr()
- 锁排查--实例
- 设计模式读书笔记:Interpreter(解释器)
- Java学习笔记
- 浮点数的范围和精度
- javaweb 待填坑
- 结构体指针
- 系统设计题分析
- java基础-输入流-读取文本文件中数据至字符串数组
- 严重: A child container failed during start
- Python编码问题
- Java集合 之 Queue集合
- 正则表达式
- [LeetCode] Valid Palindrome
- JAVA多线程和并发执行
- 蚂蚁【A001】