【数论】[HNOI2006]鬼谷子的钱袋

来源:互联网 发布:税收数据质量管理 编辑:程序博客网 时间:2024/05/22 03:30

题目

倍增以及二进制的思想
比如我们要算的是10 如果要组成的一个数能由一部分加上另一部分组成就ok了 6~10可以由1~5加5组成 所以要选5 接下来就把5除2然后再用小的一部分组成大的一部分 一直除2到不能再除
因为要从小到大输出 但第一个确定的一定是最大的 所以可以用栈存储

代码如下

#include<iostream>#include<cstdio>#include<cctype>    using namespace std;    #define in = read();    typedef long long ll;    typedef unsigned int ui;    const ll size = 100 + 1;        int n , top;        int stack[size];inline ll read(){        ll num = 0 , f = 1;    char ch = getchar();        while(!isdigit(ch)){                if(ch == '-')   f = -1;                ch = getchar();        }        while(isdigit(ch)){                num = num*10 + ch - '0';                ch = getchar();        }        return num*f;}int main(){        n in;        while(n){                stack[++ top] = ((n + 1)>>1);                n >>= 1;        }        printf("%d\n" , top);        while(top){                printf("%d " , stack[top]);                top --;        }}//COYG
原创粉丝点击