题解 [ABC276D] Divide by 2 or 3

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

翻译给得很清楚了。

分析思路

本人又一次一不小心拿到了最优解,给大家讲一讲我的做法。

我是先将 $1 \sim n$ 所有的数都进行此操作,将所有数化到不能进行下面两个操作为止,同时判断化最简后的相邻两个值是否相等。

在将所有数化到最简的同时,我们可以求出所有数的最大公约数,如果可以被 $2$ 或 $3$ 整除,那我们就可以反悔 $n$ 次操作。

代码

//the code is from chenjh
#include<cstdio>
using namespace std;
int n,a[1001];
//int b[30],c[19];
//2^29,3^18<10^9
inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
int solve(int x){//进行操作。
    int ret=0;
    while((a[x]&1)==0) a[x]>>=1,++ret;
    while(a[x]%3==0) a[x]/=3,++ret;
    return ret;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int ans,g=a[1];
    ans=solve(1);
    for(int i=2;i<=n;i++){
        g=gcd(g,a[i]);//求出最大公约数。
        ans+=solve(i);
        if(a[i]!=a[i-1]) return puts("-1"),0;//判断相邻两个数是否相等。
    }
//  g/=a[1];
//  printf("%d\n",g);
    while((g&1)==0) g>>=1,ans-=n;//反悔操作。
    while(g%3==0) g/=3,ans-=n;//同上
    printf("%d\n",ans);
    return 0;
}

谢谢大家!

posted @ 2022-11-11 18:05  Chen_Jinhui  阅读(15)  评论(0)    收藏  举报  来源