XTU OJ 1238

Description

题目描述

求n位01串含连续至少2个1的串的个数。

输入

第一行是一个整数K(K≤10000),表示样例的个数。 每行样例是一个整数n(1≤1000000)。

输出

每行输出一个样例的结果,因为数目可能很大,请对109+7取模。

样例输入

5
1
2
3
4
1000000

样例输出

0
1
3
8
782550144

思路分析:这道题应该用递推来做,首先对于i位数的总数就要看i-1的情况,而i-1变为i会有两种情况,一是在第i位加0,那么第i位确定为0,a[i]= a[i-1];  二是在第i位加1,此时就要分情况讨论,

如果说第i-1位为0,第i位确定为1,那么a[i] = a[i-2];//因为i-1和i分别确定为0和1,不属于要求的情况,因此就看i-2的情况数就行了,如果第i-1位为1,那么11满足题意,i-1位前面的就任意取0或1,因此情况数就是2^(i-2)。这题还要求掌握取模的运算法则,不然很容易爆

#include <stdio.h>
__int64 a[100000001] = {0};
const int p = 1000000007;
int main(){
	a[2] = 1;
	a[3]  = 3;//初始情况
	//开始递推!
	int j = 2;
	for(int i = 4;i<=1000000;i++){
		a[i] = ((a[i-1]+a[i-2])%p+ (2*j)%p)%p;
		j = (2*j)%p;
	}
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		printf("%I64d\n",a[n]);
	}
	
	
	
}

猜你喜欢

转载自blog.csdn.net/qq_24917263/article/details/127632322