思路是先用二进制拆分,最后再特判
#include <bits/stdc++.h>
using namespace std;
int m,n;
int f[35];
void checkout(){
if(m==1){
cout<<n<<endl<<1<<" ";
for(int i=0;i<=n-2;i++)
cout<<f[i]<<" ";
return;
}
if(m==f[n-1]){
cout<<n<<endl;
for(int i=0;i<=n-1;i++)
cout<<f[i]<<" ";
return;
}
int i;
for(i=1;i<=n-2;i++)
if(m==f[i])
break;
if(i<n-1){
cout<<n+1<<endl<<1<<" ";
for(int j=0;j<i;j++)
cout<<f[j]<<" ";
cout<<f[i]-1<<" ";
for(int j=i;j<=n-2;j++)
cout<<f[j]<<" ";
return;
}
cout<<n<<endl;i=0;
for(int j=0;j<=n-1;j++){
if(f[j]>m){
i=j;
break;
}
cout<<f[j]<<" ";
}
cout<<m<<" ";
for(int j=i;j<=n-2;j++)
cout<<f[j]<<" ";
}
int main(){
cin>>m;
f[0]=1;
for(int i=1;i<=30;i++){
f[i]=f[i-1]*2;
if(f[i]>m){
n=i;
m-=f[i-1]-1;
checkout();
break;
}
}
return 0;
}
第二个点似乎多用了钱袋