【洛谷习题】又是毕业季II
题目链接:https://www.luogu.org/problemnew/show/P1414
一开始看到的时候觉得很难,和之前的又是毕业季I相比确实更难了。
仔细做做,发现思路还是可以的,因为inf的范围较小,所以可以枚举1到inf,然后累计他们是多少个数的因数。
这样再遍历每个数,根据他是多少个数的因数去更新答案即可。
1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int maxn = 1e4 + 5, inf = 1e6 + 5; 7 8 int vis[inf], num[inf], ans[maxn]; 9 10 int main() { 11 int n, in, mmax = 0; 12 scanf("%d", &n); 13 for (int i = 1; i <= n; ++i) { 14 scanf("%d", &in); 15 ++vis[in]; 16 mmax = max(mmax, in); 17 } 18 for (int i = 1; i <= mmax; ++i) 19 for (int j = i; j <= mmax; j += i) 20 num[i] += vis[j]; 21 for (int i = 1; i <= mmax; ++i) 22 for (int j = num[i]; j >= 1; --j) 23 ans[j] = i; 24 for (int i = 1; i <= n; ++i) printf("%d\n", ans[i]); 25 }