[HNOI2006]鬼谷子的钱袋

题面
小学奥数
每次存 1 1 1 2 2 2 4 4 4 8 8 8
最后剩下几个就补几个
如果最后两个相等 就一个加一一个减一 因为有 1 1 1在 所以加一减一不耽误
不知道有没有 s p j spj spj 反正咱就是过了
上代码

#include
using namespace std;
int m,cnt,a[50];
int main(){
    scanf("%d",&m);
    for(int i=0;(1<<(i+1))-1<=m;i++)a[++cnt]=1<<i;
    if((1<<cnt)-1!=m)a[cnt+1]=m+1-(1<<cnt),cnt++;
    if(a[cnt]==a[cnt-1])a[cnt-1]-=1,a[cnt]+=1;
    sort(a+1,a+1+cnt);
    printf("%d\n",cnt);
    for(int i=1;i<=cnt;i++)printf("%d ",a[i]);
    putchar(10);
}

你可能感兴趣的:(数论)