[ABC276D] Divide by 2 or 3 题解

· · 题解

本题的目标是通过将数列中的每个数不断除以 23,来使其中每个数相等。

很显然,最终数列里唯一出现的数(记为 x),是每个数的因数。这里因为要操作数量最小,所以我们就将 x 设为所有数的最大公约数。

判断一下每个数是否可以通过只除以 23 来变成 x。即,判断每个 \dfrac{a_i}{x} 的质因数分解是否仅包含 23

放代码:

#include<bits/stdc++.h>
using namespace std;
main(){
  ios::sync_with_stdio(false);
  int n,g,c=0; cin>>n;
  vector<int> a(n);
  for(int i=0;i<n;i++){
    cin>>a[i]; if(!i)g=a[i];
    else g=__gcd(g,a[i]); // 可以使用 __gcd 函数
  }
  for(auto &i:a){
    int x=i/g;
    while(!(x&1))x>>=1,c++;
    while(!(x%3))x/=3,c++;
    if(x>1){cout<<"-1\n"; return 0;} // 还有其他的质因数
  }
  cout<<c<<endl;
  return 0;
}