记录编号 |
32808 |
评测结果 |
AAAAAAAAAA |
题目名称 |
产生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;
}