斐波那契 字首和 無限序列

2021-09-24 02:09:21 字數 1259 閱讀 5008

有這樣乙個規則:1.把「1」變成「10」 2.把「0」變成「1」

乙個序列的第一位是「1」

然後是:「10」,「101」……

序列無限次操作後會得到「1011010110110101101……」

問某乙個區間內有多少個「1」

我們按以下方式產生序列:

1、 開始時序列是: 「1」 ;

2、 每一次變化把序列中的 「1」 變成 「10」 ,「0」 變成 「1」。

經過無限次變化,我們得到序列"1011010110110101101…"。

總共有 q 個詢問,每次詢問為:在區間a和b之間有多少個1。

任務 寫乙個程式回答q個詢問

第一行為乙個整數q,後面有q行,每行兩個數用空格隔開的整數a, b。

共q行,每行乙個回答

1

2 8

4
1⩽q

⩽50001⩽a

⩽b

<263

1 \leqslant q \leqslant 5000 1 \leqslant a\leqslant b < ^

1⩽q⩽50

001⩽

a⩽b<26

3首先暴力是不可能的

我們可以發現這就是乙個斐波那契

1	10		101		10110		10110101

1 1+0 10+1 101+10 10110+101

然後寫上1的個數和長度

1			1	1

10 1 2

101 2 3

10110 3 5

10110101 5 8

可以發現他們都是斐波那契數列,而且長度為下乙個數的1的個數

我們就可以先預處理前100項(第100項⩾263

\geqslant ^

⩾263

)然後可以用其中的一些項拼成1~a-1&b的1的個數,然後用字首和原理一減就可以了

#include

#define ull unsigned long long

using

namespace std;

int n;

ull x,y,a[

105]

;ull ask

(ull dep)

return ans;

}int

main()

}

無限序列 斐波那契數列

description 我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 input 第...

斐波那契 遞迴 無限序列

我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 第一行為乙個整數q,後面有q行,每行兩...

斐波那契序列

斐波那契 fibonacci1170 1250 義大利最傑出的數學家。其父為比薩的商人,他認為數學是有用的,因此送斐波那契向阿拉伯教師們學習數學,掌握了印度數碼之一新的記數體系,後來遊歷埃及 敘利亞 希臘 西西里 法國等地,掌握了不同國家和地區商業的算術體系,1200年回答比薩,潛心研究數學,120...