P2320 [HNOI2006]鬼谷子的錢袋 分治

  

題目描述

鬼谷子很是聰明,正由於這樣,他很是繁忙,常常有各諸侯車的特派員前來向他諮詢時政。c++

有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍賣行(聚寶商行)將要舉行一場拍賣會,其中有一件寶物引發了他極大的興趣,那就是無字天書。ide

可是,他的行程安排得很滿,他已經買好了去邯鄲的長途馬車票,不巧的是出發時間是在拍賣會快要結束的時候。因而,他決定事先作好準備,將本身的金幣數好並用一個個的小錢袋裝好,以便在他現有金幣的支付能力下,任何數目的金幣他都能用這些封閉好的小錢的組合來付帳。spa

鬼谷子也是一個很是節儉的人,他千方百計使本身在知足上述要求的前提下,所用的錢袋數最少,而且不有兩個錢袋裝有相同的大於1的金幣數。假設他有m個金幣,你能猜到他會用多少個錢袋,而且每一個錢袋裝多少個金幣嗎?ci

輸入輸出格式

輸入格式:input

 

包含一個整數,表示鬼谷子現有的總的金幣數目m。其中,1≤m ≤1000000000。it

 

輸出格式:class

 

兩行,第一行一個整數h,表示所用錢袋個數im

第二行表示每一個錢袋所裝的金幣個數,由小到大輸出,空格隔開支付

 

輸入輸出樣例

輸入樣例#1:  複製
3
輸出樣例#1:  複製
2
1 2


比較巧妙 沒想到T_T
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3
const int N=500+5;
const int M=10*N;
ll a[N];
int main()
{
    ll n;
    cin>>n;
    int cnt=0;
    while(n)
    {
        a[++cnt]=(n+1)/2;
        n/=2;
    }
    cout<<cnt<<endl;
    repp(i,cnt,1)
        printf("%d ",a[i]);


    return 0;
}
View Code
相關文章
相關標籤/搜索