汉诺塔(一)

描述

在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

现在请你计算出起始有m个金片的汉诺塔金片全部移动到另外一个针上时需要移动的最少步数是多少?(由于结果太大,现在只要求你算出结果的十进制位最后六位)

输入
第一行是一个整数N表示测试数据的组数(0<N<20)
每组测试数据的第一行是一个整数m,表示起始时金片的个数。(0<m<1000000000)
输出
输出把金片起始针上全部移动到另外一个针上需要移动的最少步数的十进制表示的最后六位。
样例输入
2
1
1000
样例输出
1
69375

方法一:

对于汉诺塔求移动次数公式为f(n+1)=f(n)*2+1;
此题如果用要求十进制最后六位,f(n+1)=(f(n)*2+1)%100000;
每次输入层数,求出移动次数,但如果输入数据很大,利用此公式必定超时,经过多次测试,发现若输入数据大于100005,有如下规律,如:
f(123456)=f(23456); f(123456789)=f(23456789)---=f(56789)
即略去高位,
但 if(m%100000<6)则需进行此操作 m=100000+m%10;
这样就不会超时了

代码示例:

#include<stdio.h>
int a[100010];
int main()
{int n;scanf("%d",&n);int i;a[1]=1;for(i=1;i<100006;i++)a[i+1]=(a[i]*2+1)%1000000;while(n--){long long int m;scanf("%lld",&m);if(m>100005){if(m%100000<6)m=100000+m%10;elsem=m%100000;}printf("%d\n",a[m]);}return 0;
}

方法二:

快速模幂法

代码示例1:

#include<stdio.h>
int pm(long long m)
{const int p=1000000;if(m==1)return 2;long long t=pm(m/2);return (t*t%p)*((m%2?2:1)%p)%p;
}
int main()
{int n;long long a;scanf("%d",&n);while(n--){scanf("%lld",&a);printf("%d\n",pm(a)-1);}
}

代码示例2:

#include<stdio.h>
long long pow_mod(long long n)
{if(n==1) return 2;long long t;t=pow_mod(n/2);if(n%2==0){return ((t%1000000)*(t%1000000))%1000000;}else{return (2*(t%1000000)*(t%1000000))%1000000;}
}
int main()
{int test;long long n;scanf("%d",&test);while(test--){scanf("%lld",&n);printf("%d\n",pow_mod(n)-1);}return 0;
}

代码示例3:

#include<stdio.h>
long long pow_mod(long long n)
{if(n==1) return 2;long long int s=1,c=2;while(n!=0){if(n&1)s=(s*c)%1000000;c=(c*c)%1000000;n>>=1;}return s;
}
int main()
{int test;long long n;scanf("%d",&test);while(test--){scanf("%lld",&n);printf("%d\n",pow_mod(n)-1);}return 0;
}

ps:我用的是方法二的代码3,其他的都是大神写的。。

nyoj 汉诺塔(一)相关推荐

  1. NYOJ 93 汉诺塔 (数学)

    题目链接 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片 ...

  2. nyoj 88 汉诺塔一

    一直比较纠结汉诺塔具体怎么移动的,今天终于鼓足勇气查了一下.... 算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看).后来一位美国学者(那 ...

  3. NYOJ 88 汉诺塔(一)

    描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所 ...

  4. 汉诺塔(三)_栈的应用

    问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...

  5. 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

    前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...

  6. Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

    1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s== ...

  7. 技术图文:如何实现汉诺塔问题?

    背景 最近在辅导小孩们学习编程,在介绍函数递归时,最典型的就是汉诺塔问题了. 我在这里总结一下,以方便大家的学习. 汉诺塔问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在 ...

  8. 汉诺塔问题---小昝

    C语言 #include <stdio.h> void move(char A,char C){printf("%c ---> %c\n",A,C); }void ...

  9. 轻松理解汉诺塔问题(图解java描述)

    引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...

最新文章

  1. 开发漫谈:RedMonk编程语言流行榜出炉
  2. 大学生学习c语言方法,针对在校大学生的C语言入门学习——函数
  3. OncePerRequestFilter-源码解析
  4. python高阶函数filter_python 高阶函数之filter
  5. 巨头垄断,Facebook直接封杀了一个国家!
  6. thinkphp5记录
  7. 前端学习(3167):react-hello-react之鼠标添加一个todoList
  8. C++程序设计语言(特别版) -- 一个桌面计算器
  9. 连肝7个晚上,总结了66条计算机网络的知识点
  10. PHP实现8进制转10进制,php 实现进制相互转换
  11. Asp.Net MVC 的重要入门概念
  12. Windows 2008 防火墙开放端口
  13. CSDN 积分的作用
  14. MATLAB全局变量
  15. Docker技术之容器与外部相连
  16. 微型计算机分类可以分为哪些,微型计算机的分类通常以微处理器的什么来划分...
  17. PDF、PMF、CDF是什么
  18. Java杂谈——求所有的4位吸血鬼数字
  19. 实战智能推荐系统(6)-- 用户行为分析
  20. linux根分区写保护,目录写保护,求助大神

热门文章

  1. 手机自动化脚本-- 模拟器模拟真机环境过检测
  2. 1、alert(111) 直接打印出 111 2、debugger 写在代码要调试的地方 3、直接在控制台 source 里找到要调试的代码打断点 4、consol
  3. 爱护乳腺,AI不宜迟—英特尔人工智能助力乳腺癌早筛及诊治
  4. CCC3.0学习笔记_快速交易
  5. JAVA falco peregrine_FALCO Peregrine Kamm Edition 装车纪实 ①
  6. 原始数据哪里找?这些网站要用好!200个国内外经济/金融/行研/咨询数据网站大全(附链接)...
  7. 图神经网络(10)- relational GCN
  8. 【深度强化学习】Advantage Actor-Critic
  9. 【信息学奥数】—— 第一部分 C++语言 知识总结
  10. 07_I.MX6ULL_Cortex-A中断原理