zoukankan      html  css  js  c++  java
  • [模拟]无限序列

    无限序列

    题目描述

    我们按以下方式产生序列:
    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;
    }
    
  • 相关阅读:
    font-weight(字体粗细)属性
    Node.js入门(三)
    js难点问题
    Node.js入门(二)
    Node.js入门(一)
    Reactjs的Controller View模式
    智能社的邀请码
    react native 学习资料汇总
    jquery操作select
    分享
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300171.html
Copyright © 2011-2022 走看看