给一个正整数 \(n\) ,每一步可以让 \(n\) 除以 \(6\) 或者让 \(n\) 乘以 \(2\) 。询问进过多少次操作可以使得 \(n\) 变为 \(1\) 。或者回答不可能。
在唯一分解定理下观察 \(n\) 。
- 如果 \(n\) 除以 \(6\) ,则 \(2^{\alpha_1}3^{\alpha_2-1}\) 会变为 \(2^{\alpha_1-1}3^{\alpha_2-1}\) 。
- 如果 \(n\) 乘以 \(2\) ,则 \(2^{\alpha_1}\) 会变成 \(2^{\alpha_1+1}\) 。
于是若 \(n\) 存在 \(2, 3\) 以外的质因子则不能变为 \(1\) 。
若 \(\alpha_1 > \alpha_2\) 则不能变为 \(1\) 。
否则 \(n\) 能变为 \(1\) ,操作次数为 \(\alpha_2 + (\alpha_2 - \alpha_1)\)。
view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
int n; std::cin >> n;
int cnt2 = 0, cnt3 = 0;
while (n % 2 == 0) {
cnt2 += 1;
n /= 2;
}
while (n % 3 == 0) {
cnt3 += 1;
n /= 3;
}
if (n > 1) std::cout << -1 << '\n';
else if (cnt2 > cnt3) std::cout << -1 << '\n';
else std::cout << cnt3 + (cnt3 - cnt2) << '\n';
}
int main() {
int _ = 1; std::cin >> _;
while (_--) {solve();}
return 0;
}
- Codeforces Multiply divide Round bycodeforces multiply divide round codeforces dividing round 856 multiply divide abc 254 题解multiply divide abc competition codeforces summarize divide codeforces equalize divide 1799b educational codeforces round rated codeforces round 911 div codeforces round 864 div codeforces round 887 div