題解 CF1362A 【Johnny and Ancient Computer】
阿新 • • 發佈:2020-10-18
這題貌似沒什麼好講的= =
大概就是對於每對 \(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\) 然後依次嘗試 \(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; }