AtCoder Beginner Contest 276-D
AtCoder Beginner Contest 276
D——Divide by 2 or 3
题目链接:https://atcoder.jp/contests/abc276/tasks/abc276_d
题目说了一个什么事呢,其实就是给你n个数字,你可以执行相应的操作——如果数字是2的倍数,可以将该数字除以2;如果数字是3的倍数,可以将该数字除以3。
那么问你的就是你能不能通过一定的操作令所有的数都相同,如果可以,找到所需最小的操作数。
问题其实很简单,自己刚开始做的时候想复杂了。
其实我们可以先找所有数字的最大公因数a,a就是我们完成所有操作后数组元素相等的那个数(为啥呢?我觉得吧,将每一个数都拆分成2和3和一个其他的数的乘积就能理解了),然后将所有的元素都进行除2除3的操作,尝试将其化为a。如果尝试的过程中不能化成a,那么它的因子里面就存在着除了2、3、a以外的其他因子,那么它就是数组里不能满足要求的元素,输出-1;没有这种情况出现时,给定的数组可以满足题目的要求,统计一下除2和除3的次数即可。
多说无益,上代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int gcd(int a,int b){
int t;
if(a<b) {t=a;a=b;b=t;}
if(b==0) return a;
else return gcd(b,a%b);
}
using namespace std;
const int maxm=1e3+5,inf=0x3f3f3f3f;
int n,a[maxm];
void solve(){
cin>>n;
int r=0,cnt=0;
for(int i=0;i<n;++i){
cin>>a[i];
r=gcd(a[i],r);
}
for(int i=0;i<n;++i){
a[i]/=r;
while(a[i]%2==0){
a[i]/=2;
++cnt;
}
while(a[i]%3==0){
a[i]/=3;
++cnt;
}
if(a[i]!=1){
cout<<-1<<endl;
return ;
}
}
// cout<<r<<endl;
cout<<cnt<<endl;
return ;
}
signed main(){
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
// cin>>_;
while(_--){
solve();
}
return 0;
}

浙公网安备 33010602011771号