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;
} 
posted @ 2023-03-01 17:26  曹轩鸣  阅读(24)  评论(0编辑  收藏  举报