P8093 题解
这里提供一个新奇的思路。
大家考虑一个弱化情况:如果只允许除以
这就非常容易考虑。让
大家推样例是否发现这样一个情况:
啧……是不是就和我们弱化情况开始有点类似了呢?也就是说,我们需要找一个数
后面只允许乘
所以,我们只需要枚举
code
#include <bits/stdc++.h>
using namespace std;
long long n;
long long len(long long num) {
for (long long i = 63; i >= 0; i--) {
if ((num >> i) & 1) {
return i + 1;
}
}
return 0;
}
long long get(long long num, long long i, long long len) {
return num >> (len - i);
}
void solve() {
long long a, b, c, cnt = 0, ans = INT_MAX;
cin >> a >> b;
if (a == b) {
cout << 0 << endl;
return;
}
c = len(b);
long long save = a;
for (long long i = 1; i <= c; i++, ans = min(ans, cnt), a = save) {
cnt = 0;
long long nowb = get(b, i, c);
while (a != nowb) {
if (a > nowb) {
if (a & 1) a++;
else a /= 2;
cnt++;
} else {
cnt += nowb - a;
a = nowb;
}
}
for (long long j = i + 1; j <= c; j++) {
nowb = get(b, j, c);
a <<= 1;
cnt++;
if (nowb != a) a++, cnt++;
}
}
cout << ans << endl;
}
int main() {
cin >> n;
while (n--) {
solve();
}
return 0;
}