一 开 始 所 有 数 的 g c d 一 定 是 1 一开始所有数的gcd一定是1 gcd1

因 为 1 的 倍 数 > 2 的 倍 数 > 3 的 倍 数 . . . 因为1的倍数>2的倍数>3的倍数... 1>2>3...

所 以 一 定 是 构 造 g c d = 2 比 较 快 所以一定是构造gcd=2比较快 gcd=2

所 以 第 一 步 先 删 掉 所 有 奇 数 , 剩 下 的 g c d = 2 所以第一步先删掉所有奇数,剩下的gcd=2 ,gcd=2

那 么 接 下 来 删 掉 所 有 不 是 4 的 倍 数 , 剩 下 的 g c d = 4 那么接下来删掉所有不是4的倍数,剩下的gcd=4 4,gcd=4

接 下 来 删 掉 所 有 不 是 8 的 倍 数 , 剩 下 的 g c d = 8 接下来删掉所有不是8的倍数,剩下的gcd=8 8,gcd=8

一直到这里都很简单

但 是 观 察 一 下 样 例 3 , 答 案 是 1   1   3 但是观察一下样例3,答案是1\ 1\ 3 3,1 1 3

千 万 不 要 以 为 3 是 个 特 例 ! ! 而 应 该 提 醒 你 , 忘 记 考 虑 什 么 了 ! ! \color{Red}千万不要以为3是个特例!!而应该提醒你,忘记考虑什么了!! 3!!,!!

没 错 , 如 果 剩 下 4   8   12 这 样 类 似 的 3 个 数 , 我 们 的 算 法 会 删 掉 4 和 12 , 剩 下 8 没错,如果剩下4\ 8\ 12这样类似的3个数,我们的算法会删掉4和12,剩下8 ,4 8 123,412,8

但 是 此 时 删 掉 4 和 8 , 剩 下 12 却 是 更 优 秀 的 ! ! 但是此时删掉4和8,剩下12却是更优秀的!! 48,12!!

为 什 么 ? 因 为 此 时 后 面 已 经 没 有 16 了 , 不 需 要 去 凑 8 , 最 后 一 个 数 最 大 就 是 12 为什么?因为此时后面已经没有16了,不需要去凑8,最后一个数最大就是12 ?16,8,12

#include <bits/stdc++.h>
using namespace std;
int n,k=1,flag=1;
int main()
{
	cin >> n;
	int qi=n;
	while(n)
	{
		int x=(n+1)/2; 
		n/=2;
		if(n==0&&x==1&&k+k/2<=qi)//如果是最后一个数字,特判 
		{
			cout<<k+k/2<<" ";
			break;
		}
		for(int i=1;i<=x;i++)	cout<<k<<" ";
		k*=2;
	}
}