首先我们来求第m次移动的盘子号数,先列出当m比较小可以直接观察的前几项

m : 1、2、3、4、5、6、7、8、9、10

id : 1、2、1、3、1、2、1、4、1、2

很容易联想到树状数组的lowbit,这题的id就是lowbit(m)在二进制中的编号。

for (id = 1; (m & 1) == 0; id++, m >>= 1); 就能求出id。

然后还要求从哪个盘移到哪个盘,经模拟前几项发现:

当n是奇数时:

如果id是奇数,那么盘子的移动顺序总是 1 -> 3 , 3 -> 2 , 2 -> 1 , 1 -> 3 , 3 -> 2 , 2 -> 1无限循环

如果id是偶数,那么盘子的移动顺序总是 1 -> 2 , 2 -> 3 , 3 -> 1 , 1 -> 2 , 2 -> 3 , 3 -> 1无限循环

当n是偶数时:

如果id是奇数,那么盘子的移动顺序总是 1 -> 2 , 2 -> 3 , 3 -> 1 , 1 -> 2 , 2 -> 3 , 3 -> 1无限循环

如果id是偶数,那么盘子的移动顺序总是 1 -> 3 , 3 -> 2 , 2 -> 1 , 1 -> 3 , 3 -> 2 , 2 -> 1无限循环

经过上面右移之后的m必然是一个奇数,m >> 1可以求出id号盘子之前被移动过几次;

Accepted 2511 0MS 1360K 589 B G++
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
int main() {
int t, n;
LL m;
scanf("%d", &t);
while (t--) {
scanf("%d%lld", &n, &m);
int id, from, to;
for (id = ; (m & ) == ; id++, m >>= );
if ((id & ) ^ (n & )) {
from = (m >> ) % + ;
to = from % + ;
} else {
// 这里这样写是为了保证from在1到3之间
from = (- - (m >> )) % + ;
to = (from + ) % + ;
}
printf("%d %d %d\n", id, from, to);
}
return ;
}

HDU-2511-汉诺塔 X的更多相关文章

  1. HDU 2511 汉诺塔X

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2511 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.在 ...

  2. HDU 1207 汉诺塔II (找规律,递推)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1207 汉诺塔II Time Limit: 2000/1000 MS (Java/Others)     ...

  3. HDU 2077 汉诺塔IV (递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2077 还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是 ...

  4. HDU 2064 汉诺塔III (递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到 ...

  5. hdu 1207 汉诺塔II (DP+递推)

    汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. HDU 2064 汉诺塔III

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. HDU 2064 汉诺塔III(递归)

    题目链接 Problem Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘 ...

  8. HDU 1207 汉诺塔II (递推)

    经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上 ...

  9. HDU——2064汉诺塔III

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  10. HDU 1997汉诺塔VII

    又是汉诺塔~ 回顾一下汉诺塔的移动过程. 从左到右设为A,B,C  3个盘子的时候 1: No.1  A -> C 2: No.2  A -> B 3: No.1  C -> B 4 ...

随机推荐

  1. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

  2. 01 语言基础+高级:1-3 常用API第一部分_day07【Scanner类、Random类、ArrayList类】

    day07[Scanner类.Random类.ArrayList类] Scanner类Random类ArrayList类 教学目标 能够明确API的使用步骤能够使用Scanner类获得键盘录入数据能够 ...

  3. JavaWeb部分视频\2-12JSP,EL和JSTL

    JavaWeb知识结构图 第3节 EL介绍和运算符 && 第4节 EL获取域中存储的数据 ## EL表达式 1. 概念:Expression Language 表达式语言 2. 作用: ...

  4. PAT Advanced 1154 Vertex Coloring (25) [set,hash]

    题目 A proper vertex coloring is a labeling of the graph's vertices with colors such that no two verti ...

  5. miniconda安装jupyter

    1.安装jupyter 由于miniconda是anaconda的简化版,只有一个prompt: 安装jupyter,只需要打开prompt的dos窗口,输入命令pip install jupyter ...

  6. Mybatis配置文件无故报错、无自动完成提示的解决方法,及自动生成主要配置项

    1.引子 Mybatis配置文件显示红叉有错误,而实际检查又没有错误,这是因为开发环境不能识别这种类型的xml文件.要解决这个问题,就要让IDE开发环境能够“认识”这个文件类型,我们要让IDE环境将这 ...

  7. redis备忘录

    Redis 是一个基于内存的高性能key-value数据库.Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数 ...

  8. Apache Commons Lang之日期时间工具类

    码农不识Apache,码尽一生也枉然. FastDateFormat FastDateFormat是一个快速且线程安全的时间操作类,它完全可以替代SimpleDateFromat.因为是线程安全的,所 ...

  9. 爬虫笔记(九)——安装Fiddler

    在ubuntu下不能直接安装Fiddler,我们要先安装mono环境,具体可分为三个步骤: 1.   在终端下输入指令安装mono环境 :sudo apt-get install mono-compl ...

  10. 学习ECC及Openssl下ECC生成密钥的部分源代码心得

    一.ECC的简介 椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则.椭圆曲线在如下两个域中定义:Fp域和F2m域. Fp域,素数域,p为素数: F2m域:特征为2的有限域,称之为二元域或 ...