最多1e5个 在1e5以内的数,求两个数使得他们最大公因子最大。
用素数筛法,倒叙枚举公因子,然后统计所有是公因子倍数的数的个数。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn = 1e5+100; int a[maxn],n; int main() { int kase=1; int T; scanf("%d",&T); while(T--){ scanf("%d",&n); memset(a,0,sizeof(a)); int max_=0; int res =0; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); max_=max(max_,x); a[x]++; } for(int i=max_;i>=1;i--){ int cnt = 0; for(int j=i;j<=maxn-100;j+=i){ if(j>max_) break; cnt+=a[j]; if(cnt >=2) { res=i; break; } } if(cnt>=2) break; } printf("Case #%d: %d\n",kase++,res); } return 0; }