【数学】【乱搞】【AOJ-331】汉诺塔
2013-12-19 15:33
260 查看
Description
大家都听说过汉诺塔吧?有n个圆盘由小到大排列,套在a柱上,每次只能移动一个圆盘,而且只能大的在下,小的在上,让你把a柱上的圆盘移到b柱,给你一个多余的c柱,问你最少移动多少次才能完成任务。
Input
输入有多组数据,每组包括一个整数n(n<=10000000),表示初始状态下有n个圆盘,当输入的n为0时,程序结束,n为负的情况不作处理。
Output
对每个输入,对应一行输出,每行输出包括一个整数,即移动的最小次数,因为数目非常大,所以请对9973求余后再输出。
SampleInput
SampleOutput
第n次移动时,需要把前n-1个移动到c上(假设开始在a,需全部移到b上),然后把第n个放在b上,再把前n个放在b上
得到递推公式:f(n)=f(n-1)+1+f(n-1)
用数学归纳法可证f(n)=2^n-1
先打表,依次算2^n会超时
参考代码:
大家都听说过汉诺塔吧?有n个圆盘由小到大排列,套在a柱上,每次只能移动一个圆盘,而且只能大的在下,小的在上,让你把a柱上的圆盘移到b柱,给你一个多余的c柱,问你最少移动多少次才能完成任务。
Input
输入有多组数据,每组包括一个整数n(n<=10000000),表示初始状态下有n个圆盘,当输入的n为0时,程序结束,n为负的情况不作处理。
Output
对每个输入,对应一行输出,每行输出包括一个整数,即移动的最小次数,因为数目非常大,所以请对9973求余后再输出。
SampleInput
1 2 3 4 0
SampleOutput
1 3 7 15 思路:
第n次移动时,需要把前n-1个移动到c上(假设开始在a,需全部移到b上),然后把第n个放在b上,再把前n个放在b上
得到递推公式:f(n)=f(n-1)+1+f(n-1)
用数学归纳法可证f(n)=2^n-1
先打表,依次算2^n会超时
参考代码:
#include<stdio.h>
inta[10000010];
intmain()
{
intn,m;
inti=1,sum=1;
intl=10000009;
while(l--)
{
sum=(sum%9973*2%9973)%9973;
a[i]=sum;
i++;
}
while(scanf("%d",&n)&&n)
{
if(n<0)
continue;
m=(a
-1)%9973;
printf("%d\n",m);
}
return0;
}
相关文章推荐
- Django shell非交互模式运行
- quartz使用cron表达式的实例
- php中heredoc的使用方法
- PRIMASK与 FAULTMASK,以及CPSID/CPSIE
- Oracle常用函数 汇总
- 观察者模式
- 蜗牛—cocos2dx之2.2以上版本新建项目
- NYOJ 352 数乌龟
- 计算机视觉、机器学习相关领域论文和源代码大集合(持续更新)
- EasyUI 常规用法
- edittext默认没有焦点
- android程序的完美退出
- 安卓手机如何判断蓝牙耳机链接状态
- 第十七周 三个数排序
- OpenStack Grizzly实例重启之后cinder-volume服务无法启动的解决办法
- Object-C 学习笔记(二十九)--- 归档(2)
- 程序人生的四个象限和两条主线
- MyEclipse自定义Java文件语法颜色。 java Syntax Coloring
- Android的一些设备信息
- 一直以来伴随我的一些学习习惯(四):知识结构