题目链接: 又一道 GCD 问题
大致题意
略
解题思路
把给出的数字求出所有约数, 然后从大到小枚举当前拥有当前约数的数字个数是否满足要求即可.
这里提一点, 分解质因数 和 求所有约数 的函数写法很相似, 复杂度最坏也都是 O(√n). 但是两者是有本质却别的.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
int cou[N];
void fact(int x) {
for (int i = 1; i <= x / i; ++i) {
if (x % i == 0) {
int a = i, b = x / i;
cou[a]++, cou[b] += a != b;
}
}
}
int main()
{
int n; cin >> n;
rep(i, n) {
int x; scanf("%d", &x);
fact(x);
}
int pos = N - 10;
for (int i = 2; i <= n; ++i) {
while (cou[pos] < i) pos--;
printf("%d%c", pos, " \n"[i == n]);
}
return 0;
}
至于为什么突然写了这么简单的一道题呢? 是为了记录团队打比赛SX的一晚上, 三个人能看半天这个题想不出!