思路:相当于找[1,m]里面哪个数能被最多的数组元素整除,但O(m*n)不可行,正解是将每个数组元素自加到其倍数上,到时统计一下哪个倍数最多即可,O(m*logm)。
# include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+30;
int cnt[maxn], cnt2[maxn], a[maxn];
int main()
{
int n, m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; ++i)
{
scanf("%d",&a[i]);
if(a[i] <= m) ++cnt[a[i]];
}
for(int i=1; i<=m; ++i)
for(int j=i; j<=m; j+=i)
cnt2[j] += cnt[i];
int ans = 0, id = 1;
for(int i=1; i<=m; ++i)
if(cnt2[i] > ans) ans = cnt2[i], id = i;
printf("%d %d\n",id, ans);
for(int i=0; i<n; ++i)
if(id % a[i] == 0)
printf("%d ",i+1);
return 0;
}