ACM_无聊者序列(斐波那契数列大数+同余+规律)

Posted 霜雪千年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM_无聊者序列(斐波那契数列大数+同余+规律)相关的知识,希望对你有一定的参考价值。

Problem Description:

瓜瓜在玩着由红色和蓝色的大理石做成的玻璃珠,他将n个玻璃珠从左到右排成一个序列叫做无聊者序列。一个非空的红色和蓝色玻璃珠组成的序列是一个无聊者序列。这个序列的玻璃珠颜色是交替的,例如:序列(红色;蓝色;红色)和(蓝色)是一个无聊者序列。(红色;红色)不是无聊者序列。现在,瓜瓜想知道,从这个序列中选出一个无聊者子序列有多少种方法。并将它mod(1000000007)。

Input:

输入有多组数据,输入一个整数n(1 <= n <= 10^6),代表这个无聊者序列的个数。

Output:

输出一个数,代表子序列的个数为多少,该数需要mod(1000000007)

Sample Input:

3
4

Sample Output:

6
11
Hint:
对于第一个样例,假如我们猜测瓜瓜初始排列的玻璃珠序列为(红色;蓝色;红色),那么无聊者序列的子序列将会是以下6个:
红
蓝
红
红蓝
蓝红
红蓝红
解题思路:规律题。简单推导一下前5个玻璃珠构成地无聊者序列:记红色为0,蓝色为1;规则:序列颜色是交替的。
当n=1时,假设序列是0(当然也可以是1,但只要其中地一种情况就可以了),所以子序列为0--->1个;
当n=2时,假设序列是01(当然也可以是10),此时的子序列为0、1、01--->3个;(1+2
当n=3时,假设序列是010(当然也可以是101),此时的子序列为0、1、0、01、10、010--->6个;(3+3
当n=4时,假设序列是0101(当然也可以是1010),此时的子序列为0、1、0、1、01、01、10、01、010、101、0101--->11个;(6+5
当n=5时,假设序列是01010(当然也可以是10101),此时的子序列为0、1、0、1、0、01、01、10、10、01、10、010、010、010、101、010、0101、1010、01010--->19个;(11+8
以上求子序列要按照无聊者序列规则来从左到右推导,通过观察结果个数之间的关系,可以发现后一个数减去前一个数的结果刚好为斐波那契数列规律,于是果断打表,但打表过程可能出现数据过大,此时的取余应为同余思想,剩下就简单了,水过。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1000005;
 4 const int mod = 1000000007;
 5 typedef long long LL;
 6 LL a[maxn],b[maxn];
 7 int main(){
 8     a[0]=a[1]=b[1]=1;
 9     for(int i=2;i<maxn;++i)
10 a[i]=(a[i-1]%mod+a[i-2]%mod)%mod;//同余 11 for(int i=2;i<maxn;++i) 12 b[i]=(b[i-1]+a[i])%mod; 13 int n; 14 while(cin>>n){ 15 cout<<b[n]<<endl; 16 } 17 return 0; 18 }

以上是关于ACM_无聊者序列(斐波那契数列大数+同余+规律)的主要内容,如果未能解决你的问题,请参考以下文章

斐波那契数列有啥规律

ACM_Fibonacci数(同余)

斐波那契数列的全部规律

HDU1250大数+斐波那契数列

百度之星 预赛002 大数问题+斐波那契数列

斐波那契数列(大数加法)