A50540.gcd 题解
2025-06-23 05:45:13
发布于:北京
50阅读
0回复
0点赞
思考一个问题:已知一个 ,那么能否快速判断是否有子序列,让其最大公约数为 ?容易想到计算所有 的倍数的最大公约数 ,再判断 是否等于 即可。 可以枚举得到。显然,,所以 最多是 而且卡不满,这样我们就解决了如何选择子序列。
而且,选择所有 的倍数作为子序列是最优的(比较简单不再赘述)。此时,子序列的最大公约数应该是 ,非子序列中的最大公约数直接计算即可。最后取最大值。
虽然 带有一只 有概率超时,但是刚才说了, 是卡不满的,所以不用担心。
时间复杂度:卡不满的 .
空间复杂度:.
Code:
#include<bits/stdc++.h>
using namespace std;
int n,g,gg,ans;
int a[5005];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=5000;i++){
g=0;
for(int j=1;j<=n;j++){
if(a[j]%i) continue;
g=__gcd(a[j],g);
}
if(i==g){
gg=0;
for(int j=1;j<=n;j++){
if(a[j]%i) gg=__gcd(a[j],gg);
else gg=__gcd(g+1,gg);
}
ans=max(gg,ans);
}
}
cout<<ans;
return 0;
}
全部评论 1
预处理出 是不是更快?
2025-06-25 来自 广东
0理论上是的,但是 常数本来就很小,而且预处理吃空间
2025-06-25 来自 北京
0你还怕这个?
2025-06-25 来自 广东
0试过了,没预处理 101 ms,预处理 244 ms,本来卡不满的,写个预处理给我自己卡满了
2025-06-25 来自 北京
0
有帮助,赞一个