| 记录编号 | 
        32808 | 
        评测结果 | 
        AAAAAAAAAA | 
    
    
        | 题目名称 | 
        607.产生01串 | 
        最终得分 | 
        100 | 
            
    
    
        | 用户昵称 | 
         QhelDIV | 
        是否通过 | 
        通过 | 
    
    
        | 代码语言 | 
        C++ | 
        运行时间 | 
        0.354 s  | 
    
    
        | 提交时间 | 
        2011-11-08 15:39:51 | 
        内存使用 | 
        0.34 MiB  | 
        
    
    
    
    		显示代码纯文本
		
		#include<fstream>
using namespace std;
ifstream fin("infinit.in");
ofstream fout("infinit.out");
unsigned long long  f[94],g[94],Q;//f[i]表示第i斐波纳契数列的长度,g[i]表示第i项斐波纳契数列含有几个1
unsigned long long St[5002],En[5002],Final;
void init()
{
unsigned long long i;	
	f[1]=1;f[0]=1;
	g[1]=1;g[0]=0;
	for(i=2;i<=93;i++)
	{
		f[i]=f[i-1]+f[i-2];
		g[i]+=g[i-1]+g[i-2];
	}
	fin>>Q;
	for(i=1;i<=Q;i++)
		fin>>St[i]>>En[i];
}
unsigned long long divide(unsigned long long O)
{
unsigned long long i,Sum=0;
	if(O==1)
		return 1;
	if(O==0)
		return 0;
	for(i=1;i<=93;i++)
		if(f[i]> O)
			break;
		else
			if(f[i]==O)
				return g[i];
	Sum=divide(f[i-1])+divide(O-f[i-1]);
	return Sum;
}
void find()
{
unsigned long long i,k,S1,S2,n1,n2,b1,b2;	
	for(i=1;i<=Q;i++)
	{
		b1=divide(St[i]-1);//查询1~St[i]-1有几个1(闭区间)
		b2=divide(En[i]);//查询1~En[i]有几个1(闭区间)
		Final=b2-b1;
		fout<<Final<<endl;
	}
}
int main()
{
	init();	
	
	find();
	
	fin.close();
	fout.close();
	return 0;
}