set - 如何有效地找到集合和整数的最大 gcd?
问题描述
给定一组整数S,以及一些包含整数w的问题。
对于每个问题,计算max{gcd(w,x)} (x in S)
.
还给出了所有数字nw<n,x<n (x in S)
的范围,所以.
我试过简单地计算所有的 gcd,但效率不够。我认为关键是做一些预处理,以便每个问题都可以在 O(log n) 或更短的时间内完成。
好吧,这就是我尝试过的:
#include "iostream"
using namespace std;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int n,m,S[1000010],w;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>S[i];
}
cin>>m;
for(int i=0;i<m;i++){
cin>>w;
int mx=0;
for(int j=0;j<n;j++){
mx=max(mx,gcd(w,S[j]));
}
cout<<mx<<endl;
}
return 0;
}
解决方案
优化的一个机会是减少要考虑的 S 的子集。由于gcd(w,x)
不能大于x
,因此可以跳过小于当前最大值的元素。
给定一组整数,我使用set <int> S;
:
for (auto it = S.rbegin(); it != S.rend(); ++it)
if (*it <= mx)
break;
else
mx = max(mx, gcd(w, *it));
推荐阅读
- python - 有没有一种简单的方法可以将 Pandas DataFrame 上的大字符串拆分为相等数量的单词?
- javascript - 反应原生,图像组件加载与该链接关联的旧图像
- python - 将嵌套列表中的值返回到 PandasDataFrame
- c - 在文件 C 中构造 fscanf
- javascript - 添加两个“document.getElementById”来计算偏移量Top
- tensorflow - keras.layers.TimeDistributed with Huggingface Transformer 给出 NotImplementedError
- wildcard - 我需要将除一个以外的所有文件从一个目录复制到另一个
- openlayers - 通过 OLCesium 启用 Cesium 的 requestRenderMode
- android - android studio中的WebView
- javascript - 数组的值未显示在特定 div 内