51nod 1179
给出 $n$ 个数
求最大的两两之间的 gcd
统计每个数出现的次数
枚举 $[1, Max]$
如果存在 $2$ 个及以上的最大的数就是 $Answer$
这里在枚举的时候
倒序枚举
每次判断见代码
时间复杂度
$\sum_{i = 1} ^ {n} \frac{n}{i}$
即 $nlogn$
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 1e5 + 10; int A[N], n; int cnt[(int)1e6 + 10]; inline void Read_sz(int a[], int b, int &Max) { for(int i = 1; i <= b; i ++) { cin >> a[i]; cnt[a[i]] ++; Max = max(Max, a[i]); } } int main() { cin >> n; int Max = 0; Read_sz(A, n, Max); for(int i = Max; i >= 1; i --) { if(i == 1) { cout << 1; return 0; } int tmp = i, js(0); while(tmp <= Max) { js += cnt[tmp]; tmp += i; } if(js > 1) { cout << i; return 0; } } return 0; }