• [模拟]无限序列


    无限序列

    题目描述

    我们按以下方式产生序列:
    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;
    }
    
  • 相关阅读:
    计算器程序
    输入三个整数,输出最大数和最小数
    输入三个数a,b,c,要示按由小到大的顺序输出
    最短路
    luogu P3953 逛公园
    二分图匹配
    luogu P3231 消毒
    [bzoj2120] [洛谷P1903] 数颜色
    [bzoj2038] [洛谷P1494] [2009国家集训队] 小Z的袜子(hose)
    [洛谷P4012] [网络流24题] 深海机器人问题
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300171.html
Copyright © 2020-2023  润新知