值的范围是
106
,所以可以想到直接枚举公倍数。然后就是要统计一个数的因数出现了几个。这个直接
O(nlogn)
。
实际上这题有一个条件弱化的思想,不需要一定是最小公倍数,大的公倍数满足,对应的最小公倍数也满足。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000005;
int n,m,a[maxn],cnt[maxn],f[maxn],_max=0,k=1;
int main(){
freopen("cf632D.in","r",stdin);
freopen("cf632D.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;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) f[j]+=cnt[i];
for(int i=1;i<=m;i++) if(_max<f[i]) _max=f[i], k=i;
printf("%d %d\n",k,_max);
for(int i=1;i<=n;i++) if(k%a[i]==0) printf("%d ",i);
return 0;
}