题意 给出一个1-n的集合 gcd 集合里面的所有数 得到的 一个 数 然后自己选择删去一个数 要使得到的数 构成的数列 的字典序最大
思路: gcd所有数 那gcd得到的数肯定要小于数组中最小的数 所以 刚开始都是1 所以优先删去1 那就要使gcd所有数经可能快得到 2
如何快速到2 呢 那就是把奇数全部删掉 那剩下得数最小就为2 了 此时为 2 4 6 8 10。。。。 此刻就从2开始删 当n==3时 有
x ,2x,3x 此时 只有 删 x 2 x 3x 才有最大得字典序 x,x,3x 处理一下就好
(看起来好多人过了,但没看题解就是不会,数学都忘光了,太菜了TAT)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int cnt=1;
while(n){
if(n==3){
printf("%d %d %d",cnt,cnt,cnt*3);
break;
}
for(int i=1;i<=n/2+n%2;i++){
printf("%d ",cnt);
}
cnt*=2;
n/=2;
}
return 0;
}