x_to_y_2
题号:NC303856
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定两个整数 x,y,你每次可以做如下两种操作之一:
  • x= \lfloor\frac{x}{2}\rfloor
  • 选择任意一个整数 z,令 x= x \ |\ z
请问最少操作几次才可以让 x 变成 y
\rule{4cm}{0.1pt}
^{\text{∗}} | :表示按位或,例如 1\ |\ 2=3

输入描述:

本题有多组测试数据

第一行输入一个整数 T(1\leq T \leq 10^5),表示数据组数。

对于每组测试数据:

每行输入两个整数 x,y(0\leq x, y\leq10^{18})

输出描述:

对于每组测试数据,输出把 x 变成 y 的最小操作次数。
示例1

输入

复制
4
1 4
0 5
8 8
123987 444

输出

复制
2
1
0
12

说明

对于第一组测试数据,一种操作次数最少的方式是:先用操作 2,选 z=9,令 x = 1 | 9 = 9,然后用操作 1,令 x = \left\lfloor\frac{9}{2}\right\rfloor = 4 = y,共 2 次操作。