【题解】NOIp模拟:最大公约数

@hzwer
从大到小枚举答案gcd
开桶统计每个数出现次数
枚举gcd的倍数求到底有几个是gcd的倍数
若大于 k k ,则输出
复杂度调和级数 O ( n l n n ) O(nlnn)

Code:

#include <bits/stdc++.h>
#define maxn 1000010
using namespace std;
int n, m, cnt[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
//	freopen("gcd.in", "r", stdin);
//	freopen("gcd.out", "w", stdout);
	n = read() ,m = read();
	for (int i = 1; i <= n; ++i) ++cnt[read()];
	for (int i = 500000; i; --i){
		int s = 0;
		for (int j = 1; i * j <= 500000; ++j) s += cnt[i * j];
		if (s >= m) return printf("%lld\n", 1LL * m * i), 0;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ModestCoder_/article/details/108197811