[模擬]無限序列

無限序列

題目描述

我們按以下方式產生序列:
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 < 263

解析
當爲第一個序列時,‘1’的個數爲1;當爲第二個序列時,‘1’的個數爲1;當爲第三個序列時,‘1’的個數爲2;當爲第四個序列時,‘1’的個數爲3;當爲第五個序列時,‘1’的個數爲5……
發現沒,‘1’的個數就與n(n爲第幾個序列)的斐波那契數列相同。而且題目是剛好只用算到斐波那契數列的第九十二項。沒超出 long long 類型。

注意事項
要定 long long 類型,斐波那契數列算到第九十二項就可以了。

AC完整程序

#include<cstdio>
#include<iostream>
using namespace std;
long long n,a,b,f[310],m;
long long czadd(long long l)
{
	m=0;
	while(l>0)
	{
		int h=1;
		while(f[h+2]<=l) h++;
		l-=f[h+1];
		m+=f[h];
	}
	return m;
}
int main()
{
	f[1]=1;
	f[2]=1;
	for(int i=3;i<=92;i++) f[i]=f[i-1]+f[i-2];
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>a>>b;
		cout<<czadd(b)-czadd(a-1)<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章