思路:枚举lcm, 每个lcm的答案只能由他的因子获得,类似素数筛搞一下。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int,int> #define piii pair<int, pair<int,int> > using namespace std; const int N = 1e6 + 10; const int M = 10 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-6; int n, m, tot, a[N], cnt[N], id[N]; vector<int> v[N]; void init() { for(int i = 1; i <= m; i++) { for(int j = i; j <= m; j+= i) { v[j].push_back(i); } } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); if(x <= m) { id[tot] = i; a[tot++] = x; } } if(tot == 0) { printf("1 0 "); } else { init(); for(int i = 0; i < tot; i++) { cnt[a[i]]++; } int mx = 0, ans = 0; for(int i = m; i >= 1; i--) { int ret = 0; for(int t : v[i]) { ret += cnt[t]; } if(ret >= mx) { mx = ret; ans = i; } } printf("%d %d ", ans, mx); for(int i = 0; i < tot; i++) { if(ans % a[i] == 0) { printf("%d ", id[i]); } } puts(""); } return 0; } /* */