专栏文章
[ABC276D] Divide by 2 or 3 题解
AT_abc276_d题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mkmfzm4r
- 此快照首次捕获于
- 2026/01/20 18:19 2 个月前
- 此快照最后确认于
- 2026/01/20 18:19 2 个月前
本题的目标是通过将数列中的每个数不断除以 或 ,来使其中每个数相等。
很显然,最终数列里唯一出现的数(记为 ),是每个数的因数。这里因为要操作数量最小,所以我们就将 设为所有数的最大公约数。
判断一下每个数是否可以通过只除以 或 来变成 。即,判断每个 的质因数分解是否仅包含 或 。
-
为什么可以将 设为最大公约数而不影响是否有解的判断?证明:若将 设为最大公约数时无解,则存在 使得 的质因数分解中包含除 和 以外的其他质因数。如果设 为最终数列中出现的唯一的数且合法,那么很显然 ,即 仍然包含除 和 以外的质因数,矛盾。所以,利用最大公约数作为最终答案是正确的解法。
放代码:
CPP#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;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...