题解 CF1362A 【Johnny and Ancient Computer】
这题貌似没什么好讲的= =
大概就是对于每对 \(a, b\) 只可能有如下 \(3\) 种情况:
a > b
此时显然可以知道你只会进行 \(a -> a / 2\), \(a -> a / 4\) 或者 \(a -> a / 8\) 这 \(3\) 种操作
然后根据贪心, 如果可以进行 \(a -> a / 8\) 操作, 并且变完以后 \(a\) 还是保证 \(a > b\) 那就用这个操作
\(a -> a / 2\) 和 \(a -> a / 4\) 都是一个道理
a < b
此时显然可以知道你只会进行 \(a -> a * 2\), \(a -> a * 4\) 或者 \(a -> a * 8\) 这 \(3\) 种操作
还是根据贪心可以先尝试 \(a -> a * 8\) 然后依次尝试 \(a -> a * 2\) 和 \(a -> a * 4\)
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <map>
#define N 1010
#define M 5000010
#define ls x << 1
#define rs x << 1 | 1
#define inf 0x3f3f3f3f
#define inc(i) (++ (i))
#define dec(i) (-- (i))
#define mid ((l + r) >> 1)
#define int long long
//#define ll long long
#define XRZ 10000000000000
#define pai acos(-1)
#define debug() puts("XRZ TXDY");
#define mem(i, x) memset(i, x, sizeof(i));
#define Next(i, u) for(register int i = head[u]; i ; i = e[i].nxt)
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout);
#define Rep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i <= i##Limit ; inc(i))
#define Dep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i >= i##Limit ; dec(i))
using namespace std;
inline int read() {
register int x = 0, f = 1; register char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
int dx[10] = {0, 1, 1, 2, 2, -1, -1, -2, -2};
int dy[10] = {0, 2, -2, 1, -1, 2, -2, 1, -1};
signed main() { int T = read();
while(T --) { int a = read(), b = read(), ans = 0;
if(a == b) puts("0");
if(a > b) {
while(a >= b) {
if(a % 8 == 0 && a / 8 >= b) a /= 8, ans ++;//可以除8就除8
else if(a % 4 == 0 && a / 4 >= b) a /= 4, ans ++;//可以除4就除4
else if(a % 2 == 0 && a / 2 >= b) a /= 2, ans ++;//可以除2就除2
else break;//如果2都除不了,那么要么已经成立,要么永远都存在不了
} if(a != b) { puts("-1"); continue;} else printf("%d\n", ans);
}
if(a < b) {
while(a <= b) {
if(a * 8 <= b) a *= 8, ans ++;//乘法同上
else if(a * 4 <= b) a *= 4, ans ++;
else if(a * 2 <= b) a *= 2, ans ++;
else break;
} if(a != b) { puts("-1"); continue;} else printf("%d\n", ans);
}
}
return 0;
}