3637. 解密信件

单点时限: 1.0 sec

内存限制: 512 MB

oxx 总是喜欢给 ultmaster 写信,由于某些原因,这些信的内容又不能被人看见。但传信的过程中,信中信息的泄露又不可避免,于是 oxx 发明了一种信内容信息的加密方式。ultmaster 拿到了 oxx 的加密程序:

char letter[];

void encrypt(l, r) {
if (l < r) {
reverse letter[l…r];
k = (r - l + 1) / 2;
encrypt(l, l + k - 1);
encrypt(l + k, r);
}
}
其中 reverse letter[l…r] 是将 letter 从 l 到 r(闭区间)的子串倒置。

对于某个长度为 n,下标从 1 开始的字符串要进行加密,只要调用 encrypt(1, n) 即可。

由于 ultmaster 有超强的理解能力,所以 ultmaster 只需要知道信里面某些位置的信息,就能得知整封信的内容。而 oxx 写了太多的信给 ultmaster 。所以 ultmaster 会有 T 次询问,每一次询问其中一封信的一个位置 x,表示加密后的信里的位置,他想知道这个位置在加密前的信里是在什么位置。

众所周知,oxx 有很多话想说,所以信会很长很长。

输入格式
第一行一个整数 T (1≤T≤1 000),表示询问的个数。

接下来的 T 行,每行两个整数 n 和 x (1≤x≤n≤1018),表示信的长度和询问的位置。

输出格式
包含 T 行,每行一个整数,表示对于每一个询问的答案。

样例
input
4
4 1
4 2
4 3
4 4
output
3
4
1
2
提示
样例解释:1234 → 43|21 → 3|4|1|2.

/*
题意为给出加密后的位置,找出加密前的位置。
加密时对称递归,解密就回溯。原来位置就是对称位置。
*/
#include<iostream>
using namespace std;
long long ans=0;
void binary(long long l,long long h,long long &x) {
	if(l<h) {
		long long k=(h-l+1)/2;
		if(x>=1&&x<=l+k-1)
			binary(l,l+k-1,x);
		else
			binary(l+k,h,x);
	}
	x=h+l-x;
}
int main() {
	int t;
	cin>>t;
	while(t--) {
		long long n,x;
		cin>>n>>x;
		ans=0;
		binary(1,n,x);
		cout<<x<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值