其实正解就是桶排啦,不过是枚举GCD后是再统计GCD倍数的个数,这样的话可以在很小很小次数内得到正解(最坏情况大概是所有数互质?不过50w个互质的数应该也不太可能会在数据里)。
1 #include
2 using namespace std;
3
4 int n, k, t, a[500050], b[500050], c[500050], maxx, tot, sum[500050];
5
6 int main() {
7 maxx=-0x7fffffff;
8 cin >> n >> k;
9 for (int i=1;i<=n;++i) {
10 scanf("%d", &a[i]);
11 maxx=max(maxx, a[i]);
12 b[a[i]]++;
13 }
14 for (int i=maxx;i;--i) {
15 tot=0;
16 for (int j=i;j<=maxx;j+=i)
17 tot+=b[j];
18 if (tot>=k) {
19 cout < endl;
20 return 0;
21 }
22 }
23 }