CF-Round #632-div2-F题
F. Kate and imperfection
这是我第一次写div2的F题似乎=-=这次的div2有点简单。hhh
这道题用埃筛嘻嘻。是个贪心把~
什么是埃筛?请参考博客:
https://blog.csdn.net/qq_44624316/article/details/105431013
题目大意:给定一个整数n,区间1~n中任选k个数(k>=2)使得其中两两的最大gcd最小。
意思就是任取k中的两个数获得最大的gcd,让gcd最小。
贪心策略:我们当然是要把素数全部选完。如果素数不够的话我们再依次把一些合数加进去。这里注意到,我们在加合数的时候,要加进去的合数的因子肯定都在这个序列中(这样把这个合数加进去的时候我们最大的gcd就是这个合数的某个因子)这样的贪心策略可以使得最大的gcd最小。
然后我们再sort一下就可以啦~
定义vector ans(n + 1, 1);
把大小为n+1的数组初始化为1.(素数的最小因数的1)
然后埃筛。
ans[j]保存j的最小因数。
sort的完毕的过程就是我们选取的过程,先选素数,再选最小因数尽可能小的合数。
代码部分很好实现。
代码部分:
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin >> n;
vector<int> ans(n + 1, 1);
for (int i = 2; i <= n; i++)
{
for (int j = i + i; j <= n; j += i)
{
ans[j] = i;
}
}
sort(ans.begin(), ans.end());
for (int i = 2; i <= n; i++)
{
cout << ans[i] << " ";
}
cout << endl;
return 0;
}

本文详细解析了CF-Round#632-div2-F题,介绍了一种使用埃筛算法的贪心策略解决该数学问题的方法。通过选择素数和特定合数来最小化所选k个数之间的最大公约数。


被折叠的 条评论
为什么被折叠?



