题解 [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;
}
谢谢大家!

浙公网安备 33010602011771号