題目:
眾所周知,度度熊喜歡的字元只有兩個:b和d。
今天,它發明了一種用b和d組成字串的規則:s(
1)=b
s(2)=bb
d s(
3)=b
bdbb
dd s
(n)=
s(n−
1)+b
+rev
erse
(fli
p(s(
n−1)
) 其中,rev
erse
(s)
指將字串翻轉,比如re
vers
e(bb
d)=d
bb ,
flip
(s)
指將字串中的b
替換為d ,
d 替換為b
,比如fl
ip(b
bd)=
ddb
。雖然度度熊平常只用它的電腦玩連連看,這絲毫不妨礙這台機器無與倫比的運算速度,目前它已經算出了s(
21000)
的內容,但度度熊畢竟只是隻熊,一次讀不完這麼長的字串。它現在想知道,這個字串的第l
位(從1開始)到第r
位,含有的b
的個數是多少?
l,r<10^18 思路
可以通過觀察前面乙個字串是後乙個字串的字首,也就是s(n)中包含前面所有的字串。所以其實可以只考慮乙個字串,s(2^1000)字串早就超出10^18所以根本不用考慮,只要考慮10^18以內就ok了。
繼續推導,l到r的b的數量,可以表示成,sumb(r)-sumb(l-1);
接下來就是如何求sumb(x)
如果x=2^p 則sumb(x)=2^(p-1)+1;否則sumb(x)=2^(p-1)+1-sumd(2^p-x-1)-1;
(這裡說明一下x到2^p的那段距離就是這個字串的字首只不過前後反轉,bd互調,所以這裡減去了sumd)
同樣sumd的求發
如果x=2^p 則sumd(x)=2^(p-1)-1;否則sumd(x)=2^(p-1)-1-sumb(2^p-x-1);
#includeusing namespace std;
long long b[100];
long long sumb(long long x);
long long sumd(long long x);
long long sumb(long long x) {
if(x==0) return 0;
if(x==1) return 1;
long long tt=1;
int i=0;
while(tt
hdu 1066 數學相關
詳細說明 include include include using namespace std char s 1005 int len,mp 25 直接計算出其迴圈節為20這裡將0 19的列表於上,當n 5時直接輸出,其餘需要遞迴n 5因為這個表是刪除了所有的5的倍數的 int slove ret...
HDU 5312(規律 數學)
思路 這個題看上去是乙個貪心,但是這個貪心顯然是錯的.事實上這道題目很簡單,先判斷1個是否可以,然後判斷2個是否可以.之後找到最小的k k 2 k k 2 使得 m k mod 6 0 m k m od6 0即可.證明如下 3n n 1 1 6 n n 1 2 13n n 1 1 6 n n 1 2...
數學模擬 HDU 4814
題意很簡單 給定乙個十進位制數,要求輸出在 1 sqrt 5 2進製中的數的表示。1 2 11 100 由於x的0次冪等於1 所以完全可以把n當成對應的x進製數的個位 現在要做的就是把這個數轉化成二進位制 題目給出的公式可以在兩邊同時乘x的若干次冪 那麼這兩個式子就變成了 x i 1 x i x i...