题目
分析
使用裴蜀定理可以很容易转化成:给 (n) 个数选择其中 (k) 个可以得到的最大公因数。
考虑最大公因数的求法,在唯一分解定理之下其实就是对质因数的指数取 (min) 。
于是对所有数分解因数,找到出现次数大于 (k) 的因数即可,贪心取最大值。
代码
#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
x=0;char ch=getchar();bool f=false;
while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template <typename T>
inline void write(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
return ;
}
const int N=1e5+5,M=1e6+5,MOD=1e9+7;
#define ll long long
#define ull unsigned long long
#define inc(x,y) (x+y>=MOD?x+y-MOD:x+y)
#define dec(x,y) (x-y<0?x-y+MOD:x-y)
int n,k,ans;
map<int,int>Map;
int main(){
read(n),read(k);
for(int i=1,x;i<=n;i++){
read(x);
for(int j=1;j*j<=x;j++){
if(x%j==0) Map[j]++,Map[x/j]++;
}
}
for(map<int,int>::iterator it=Map.begin();it!=Map.end();it++){
if((*it).second>=k) ans=max(ans,(*it).first);
}
write(ans);
return 0;
}