HDU5694 BD String 數學歸納找規律

2021-07-12 00:11:56 字數 1353 閱讀 5953

題目:

眾所周知,度度熊喜歡的字元只有兩個: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...