题目
思路
首先有一个显而易见的结论:对于任意排列,b序列中的前n/2个数总是1。
原因是相邻的两个数互质。
现在我们来考虑一个长度大于3的排列,怎样才能将b序列的字典序最大。
根据字典序的定义,我们需要最大化每一次进入队列的gcd。
即,当前最大就是整体最好的选择。
那么我们对于任意两个相邻的数,都有一个选择:删除其中的奇数或删除其中的偶数。
我们应该全部删除奇数或者全部删除偶数,不然就会有两个数相邻,从而出现gcd=1使得答案不优。
如果我们删除偶数,我们就会发现有ai=1使得这个序列的gcd=1而使得答案不优。
所以我们对于每个序列,都要删除奇数,使得gcd*=2。
观察操作后的序列
a{2,4,...,(n&1)?(n-1):(n)}
我们可以将它看成
a{2*1,2*2,2*3,...,2*(n/2)}
这样我们就把问题转化成了一个长度为n/2的子问题。
对于1<=n<=3的序列或长度小于等于3的子问题,题目的样例就是我们想要的结果,特判即可。
代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int m = 1;
while (n > 3) {
for (int i = 0; i < (n + 1) / 2; i++) {
cout << m << " ";
}
n = n / 2;
m = m * 2;
}
if (n == 3) {
cout << m << " " << m << " " << 3 * m;
}
else if (n == 2) {
cout << m << " " << 2 * m;
}
else cout << m;
return 0;
}