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]);
}
}