首先我们来求第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. 34. docker swarm Dockerstack 部署 wordpress

    1. 查看 docker compose    depoly 语法 官网地址 : https://docs.docker.com/compose/compose-file/#deploy ENDPOI ...

  2. JDBC-使用Java连接数据库-基础篇

    这是小主第一次写Java连接数据库博客,初学Java之时,Java连接数据库是我最头疼的,不过经过一个月的学习,也差不多略有收获,所以给大家分享一下. Java连接数据库大约需要五大步骤: 创建数据库 ...

  3. node.js实现http服务器进行访问

    步骤:一.安装node;二.新建一个文件夹目录(根目录),里面再新建一个server.js文件:三.打开命令行界面,进入文件夹目录然后输入命令node server.js;四.然后就可以在浏览器上通过 ...

  4. keras猫狗大战

    先划分数据集程序训练集中猫狗各12500张现在提取1000张做为训练集,500张作为测试集,500张作为验证集: # -*- coding: utf-8 -*-import os, shutil or ...

  5. js字符串相关要点

    不要创建string对象,它会拖慢执行速度,并可能产生其他副作用. var x = "John"; var y = new String("John"); (x ...

  6. 【python】两行代码实现近百年的正反日期查询--20200202

    到2020年了.有个日期也火了,记得上一次还是2011年11月2日.为啥捏,因为日期写成数字形式 正反是一样的. 2020年也有一个这样的日期.20200202:2020年2月2日. 于是乎想写一段代 ...

  7. LeetCode No.157,158,159

    No.157 Read 用 Read4 读取 N 个字符 题目 给你一个文件,并且该文件只能通过给定的 read4 方法来读取,请实现一个方法使其能够读取 n 个字符. read4 方法: API r ...

  8. c语言中continue的运用,同时学习接收字符,打印字符,遍历字符

    /************************************************************************* > File Name: continue. ...

  9. 利用CSS制作背景变色的横向导航栏

    1.表单 页面如下: <html> <head> <title>注册表单页面</title> </head> <body> &l ...

  10. 线程池-进程池-io模型

    一.线程池与进程池 什么是池?简单的说就是一个容器,一个范围 在保证计算机硬件安全的情况下最大限度的充分利用计算机, 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全,也是实现了一个并发的效果 ...