我們按以下方式產生序列:
1、 開始時序列是: 「1」 ;
2、 每一次變化把序列中的 「1」 變成 「10」 ,「0」 變成 「1」。
經過無限次變化,我們得到序列"1011010110110101101…"。
總共有 q 個詢問,每次詢問為:在區間a和b之間有多少個1。
任務 寫乙個程式回答q個詢問
第一行為乙個整數q,後面有q行,每行兩個數用空格隔開的整數a, b。
共q行,每行乙個回答
輸入樣例
1
2 8
輸出樣例4
約定
1 <= q <= 5000
1 <= a <= b < 2^63
利用字首和
我們看**
序號字串
字串長度
1的數量
1 111
112
2210
213
3310132
4
441011053
5
551011010185
6
661011010110110136
7
77101101011011010110101
2111
它的字串、字串的長度、1的數量
都遵從了斐波那契數列
然後我們假設長度為7的
我們可以找幾個斐波那契數
組合起來
比如2與5
原本長度為7
1的個數為4
長度為2和5的
1的個數為1和3
加起來就4
所以我們可以利用字首和
先求出yyy的
在求出x−1
x-1x−
1的(字首和,包括x
xx,所以-1)
相減就行了
#include
#include
#include
#include
#include
#define ll long long
using
namespace std;
ll f[
1025
],a[
1025];
ll ans,n,m,t,x,y;
ll find
(ll k)
return ans;
}int
main()
return0;
}
斐波那契 字首和 無限序列
有這樣乙個規則 1.把 1 變成 10 2.把 0 變成 1 乙個序列的第一位是 1 然後是 10 101 序列無限次操作後會得到 1011010110110101101 問某乙個區間內有多少個 1 我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1...
8 12 無限序列 1861
我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 輸入 第一行為乙個整數q,後面有q行,...
模擬 無限序列
題目描述 我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 輸入 第一行為乙個整數q,後...