一 开 始 所 有 数 的 g c d 一 定 是 1 一开始所有数的gcd一定是1 一开始所有数的gcd一定是1
因 为 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 12这样类似的3个数,我们的算法会删掉4和12,剩下8
但 是 此 时 删 掉 4 和 8 , 剩 下 12 却 是 更 优 秀 的 ! ! 但是此时删掉4和8,剩下12却是更优秀的!! 但是此时删掉4和8,剩下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;
}
}