我还以为有什么高论。。。

暴力分解质因数sort就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1050
using namespace std;
int n,k,x,top=0,s[maxn*maxn*10];
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        int t=sqrt(x);
        for (int j=1;j<=t;j++)
        {
            if (x%j) continue;
            s[++top]=j;
            if ((x/j)!=j) s[++top]=x/j;
        }
    }
    sort(s+1,s+top+1);int ret=1;
    for (int i=top-1;i>=0;i--)
    {
        if (s[i]==s[i+1]) ret++;
        else
        {
            if (ret>=k) {printf("%d\n",s[i+1]);return 0;}
            else ret=1;
        }
    }
    return 0;
}