>Description
>解题思路
从大到小枚举gcd,计算一下gcd的倍数在a中出现的个数(这里可以预处理),如果大于等于k就直接输出
比赛时的累计没有优化就只拿了60分TT
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500005
#define ll long long
using namespace std;
ll n, k, a[N], s[N];
bool y[N];
bool check (ll c)
{
ll p = 0;
for (ll i = 1; i * c <= a[n]; i++) //倍数
p += s[i * c]; //累加
if (p >= k) return 1;
return 0;
}
int main()
{
scanf ("%lld%lld", &n, &k);
for (ll i = 1; i <= n; i++) scanf ("%lld", &a[i]), s[a[i]]++; //s记录个数
sort (a + 1, a + 1 + n);
for (ll i = a[n]; i >= 1; i--) //从大到小枚举gcd
if (check (i))
{
printf ("%lld", i * k);
break;
}
return 0;
}