这道题很神奇
我们举一个例子,m=12
那么我们可以把它分成两部分,L和R:
(1,2,,6)(7,8,,12)
我们可以发现R中的数都可以由12/2和左边的数组合得到
那么我们对L再分………………
同理,奇数时将,m/2变为m/2+1即可
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int m,cnt=0,f[35]; 5 int main(){ 6 scanf("%d",&m); 7 while (m){ 8 f[++cnt]=m>>1; 9 if (m&1) f[cnt]++; 10 m>>=1; 11 } 12 printf("%d\n",cnt); 13 for (int i=cnt;i>=1;i--) 14 printf("%d ",f[i]); 15 return 0; 16 }