传送门
题解:
首先我们观察如果一直增长的话那么就是1,2,4,8…显然就是和二进制有关,这样的数一定可以拼凑出任何数,所以这道题也一定是有解的。所以,我们首先通过贪心一直增长的到接近的n,然后我们如果想找到每天分裂多少个细胞的话,我们可以这么想,如果我们分裂了相当于我们分裂了一个质量为0的细胞和一个质量为1的细胞(因为只用关心总重量),然后我们就知道了后一天比前一天多出来的质量也就是0质量的细胞变成1质量的细胞,所以后一天的质量减去前一天的质量也就是前一天的细胞分裂数。
#include <bits/stdc++.h>
using namespace std;
void solve()
{
vector<int> a;
int n; scanf("%d",&n);
for(int i=1;i<=n;i<<=1){
a.push_back(i);
n-=i;
}
if( n) a.push_back(n);
sort(a.begin(),a.end());
cout<<a.size()-1<<endl;
for(int i=1;i<a.size();i++) printf("%d ",a[i]-a[i-1]);
puts("");
return ;
}
signed main()
{
int t; scanf("%d",&t);
while (t--) solve();
}