(2条未读通知) 牛客小白月赛57_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
题意:
思路:
暴力枚举两个指针,显然超时
因此更换枚举对象,去枚举gcd
对于每一个gcd,去枚举gcd的倍数,去统计gcd的倍数在原数组中的出现次数,如果出现次数大于等于2,就说明该gcd是合法的,统计最大的合法gcd即可
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=1e6+10;
unordered_map<int,int> mp;
int n,mx=-1,res=0,ans=1;
int a[mxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;
mx=max(mx,a[i]);
}
for(int i=2;i<=mx;i++){
res=0;
for(int j=i;j<=mx;j+=i){
res+=mp[j];
}
if(res>=2) ans=max(ans,i);
}
printf("%d\n",ans);
return 0;
}
总结:
对于初级gcd问题,去考虑它的倍数,归纳一些性质