ABC-276解题报告
D. Divide by 2 or 3
题意:给你一个数组 \(a\),每次可以选择一个 \(2\) 的倍数除以 \(2\),或选择一个 \(3\) 的倍数除以三。问最少多少次操作将元素统一。无解输出
-1
。
如果有解,结果将会是 \(a\) 中元素的公因数,而所有公因数都是最大公因数的因数。由于额外的除法没有意义,最终结果一定是最大公因数。对于每个元素检查它与最大公因数是否只差了若干个 \(2\) 和若干个 \(3\)。对 \(\frac{a_i}{\gcd}\) 进行类似质因数分解的操作即可。
By zhoukangyang
#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll long long
#define sz(a) ((int) (a).size())
#define vi vector < int >
#define me(a, x) memset(a, x, sizeof(a))
#define ull unsigned long long
#define ld __float128
#define i128 __int128
using namespace std;
const int N = 1e6 + 7, mod = 998244353;
int n, m, a[N];
int main() {
// freopen("thewitness.in", "r", stdin);
// freopen("thewitness.out", "w", stdout);
ios :: sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n ;
int g = 0;
L(i, 1, n) cin >> a[i], g = __gcd(a[i], g);
int ns = 0;
L(i, 1, n) {
a[i] /= g;
while(a[i] % 2 == 0) ++ns, a[i] /= 2;
while(a[i] % 3 == 0) ++ns, a[i] /= 3;
if(a[i] > 1) {
cout << -1 << '\n';
return 0;
}
}
cout << ns << '\n';
return 0;
}