鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他諮詢時政。有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍賣行(聚寶商行)將要舉行一場拍賣會,其中有一件寶物引起了他極大的興趣,那就是無字天書。但是,他的行程安排得很滿,他他已經買好了去邯鄲的長途馬車標,不巧的是出發時間是在拍賣會快要結束的時候。於是,他決定事先做好準備,將自己的金幣數好並用乙個個的小錢袋裝好,以便在他現有金幣的支付能力下,任何數目的金幣他都能用這些封閉好的小錢的組合來付賬。鬼谷子也是乙個非常節儉的人,他想方設法使自己在滿足上述要求的前提下,所用的錢袋數最少,並且不有兩個錢袋裝有相同的大於1的金幣數。假設他有m個金幣,你能猜到他會用多少個錢袋,並且每個錢袋裝多少個金幣嗎?
input
包含乙個整數,表示鬼谷子現有的總的金幣數目m。其中,1≤m ≤1000000000。
output
只有乙個整數h,表示所用錢袋個數
sample input
sample output
hint
思路:一開始想這道題目時,就聯想到了多重揹包的二進位制優化,二者思想是一樣的,因為二進位制的數組合能產生其他別的數,所以我們要求得是他能分解成幾個二進位制只有一位為1的數,即1、2、4...2^k,我們要的結果就是k+1。一開始沒想到好辦法,就把這些數找出來求和,最後二分找到符合條件的數。之後看了題解才發現還有一種更簡單的方法用log函式。
對數函式,不是很會用,這次也正好學一下,以後也應該有意識往這邊想一下。
ac**:
#include#include#include#include#include#include#include#include#include#include#define ll long long
#define pi acos(-1.0)
#define eps 1e-8
using namespace std;
ll a[500];
int main()
ll n;
while(~scanf("%lld",&n))
return 0;
}
#include#include#include#include#include#include#include#include#include#define ll long long
#define mod 1000000007
#define eps 1e-8
using namespace std;
int main()
0
BZOJ 1192 鬼谷子的錢袋
鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他諮詢時政。有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍賣行 聚寶商行 將要舉行一場拍賣會,其中有一件寶物引起了他極大的興趣,那就是無字天書。但是,他的行程安排得很滿,他他已經買好了去邯鄲的長途馬車標,不巧的是出發時間是在拍...
Bzoj1192 鬼谷子的錢袋
time limit 10 sec memory limit 162 mb submit 3312 solved 2412 submit status discuss 鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他諮詢時政。有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍...
bzoj 1192 鬼谷子的錢袋
題目大意 用盡可能少的不同的自然數 兩兩不相同 這些自然數的和為m 且這些數能表示出m及m以下的所有數,求這些自然數的個數 思路 根據小學數學很容易就能看出 這是一道小學數學題 只要排出二進位制就好了 所以我們要找到2 k次方使它大於m 1 include2 include3 include4 in...