綿羊的銀幣

2021-10-01 08:01:48 字數 1511 閱讀 6025

我斷然沒想到面前這景象,被黑霧所包圍的眾獸,以及那輛由金角鹿所驅動的戰車。

「顯然你已經知道我是誰了吧」那個女人撫摸著金角鹿身上的皮毛

「阿爾忒彌斯,司掌狩獵和野獸的狩獵女神」我有點頭疼,居然連這種神祇都能召喚而來,那個聖杯的確是個不得了的問題

「不錯,我即是七騎之中的弓之騎士(archer)」她似乎很樂於享受這場鬧劇「你只需要回答我的乙個問題就可以繼續前行了,若不能的話,最好你有百般武藝」

「洗耳恭聽」我掏出一根雪茄點燃,想緩解一下自己

「曾有乙個牧羊人和乙個商人進行交易,但他們對交易的**爭執不下,最終他們來尋求我的智慧型。但是我並不想他們過於輕易的得到神的幫助,於是我便提出乙個規則。如果當前商人要向牧羊人購買一定數量的羊,那麼**應當等於購買這個數量的四分之一的羊的**加上購買這個數量的一半的羊的**。顯然,羊只能一整隻的賣出,而不能半隻賣出,所以當這個數量不能被分成四份或兩份,就應該下取整,這是對商人的優惠」

「這個問題最終會回到購買數量很小的情況」

「不錯,商人不買羊,就不需要支付銀幣,而如果他購買乙隻羊,那麼他需要支付一枚銀幣」她沒有停下手上的動作「無論最始的數量多大,都會回歸到一和零上面。想必你已經有了快捷計算出需要支付的金額的辦法了吧,即使沒有我也要開始提問了,若是無法回答,願君安息」

我的腦中浮現了這三個公式

f[0]

=0f[1

]=1f[n]

= f[n/2]

+ f[n/4]

(n>=

2)

輸入描述:

第一行乙個整數t ( 1 <= t <= 250000 ) ,表示t次詢問。

下面t行,每行乙個整數n ( 0 <= n <= 1018 ) ,表示當前需要購買多少只綿羊

由於輸入輸出過多,請使用scanf和printf,否則容易超時

n極大,log2(n)精度不夠,請不要使用的任何log函式,否則容易wrong answer

輸出描述:

對於每個詢問,輸出需要支付的銀幣數量

示例1

輸入41

234輸出

1112

寫乙個暴力遞迴的程式找規律打表。

注意自帶的log2()函式當輸入的數很大是會存在誤差,例如

2^50

=1125899906842624

但是

(

int)

log2

(1125899906842623)=

50(int)

log2

(1125899906842620)=

49

#include

using

namespace std;

long

long ans[80]

=;intlog

(long

long n)

}int

main()

return0;

}

H 綿羊的銀幣

時間限制 c c 2秒,其他語言4秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 題目描述 我斷然沒想到面前這景象,被黑霧所包圍的眾獸,以及那輛由金角鹿所驅動的戰車。顯然你已經知道我是誰了吧 那個女人撫摸著金角鹿身上的皮毛 阿爾忒彌斯,司掌狩獵和...

Algorithm Gossip 八枚銀幣

file name arithmetic.c creat data 2015.1.31 author zy algorithm gossip 八枚銀幣 現有八枚銀幣a,b,c,d,e,f,g,h,已知其中一枚是假幣,其重量不同於真幣,但不知是較輕或較重,如何使用天 平以最少的次數比較,決定出哪枚是假...

尋找假銀幣演算法

尋找假銀幣是乙個非常有趣的智力題目,尋找假銀幣的大意如下 現在有8 枚銀幣,其中有一枚是假幣。但是,從外觀和做工上無法分辨哪枚是真幣哪枚是假幣,只知道假幣的重量要比真幣稍輕。要求僅使用乙個天平,如何以最少的步驟尋找到假銀幣。先來分析一下尋找假銀幣問題。其實尋找假銀幣並不難,一種最基本的方法便是給硬幣...