题目描述
扔 nn 次硬币的结果可以用一串 0/10/1 序列来表示。给定 nn,请统计有多少种扔硬币的结果中不含三个连续的 00 且不含三个连续的 11。
当 nn 较大的时候,答案可能很大,所以输出答案模 1,000,000,0071,000,000,007 的余数即可。
输入格式
单个整数:表示 nn。
输出格式
单个整数:表示答案模 1,000,000,0071,000,000,007 的余数。
数据范围
- 对于 30\%30% 的数据,1\leq n\leq 201≤n≤20;
- 对于 60\%60% 的数据,1\leq n\leq 50001≤n≤5000;
- 对于 100\%100% 的数据,1\leq n\leq 1,000,0001≤n≤1,000,000。
样例数据
输入:
3
输出:
6
#include<bits/stdc++.h>
using namespace std;
const int P=1000000007,N=1000005;
int n,a[N][4];
int main(){
scanf("%d",&n);
if(n==1){puts("2");return 0;}
a[2][0]=a[2][1]=a[2][2]=a[2][3]=1;
for(int i=3;i<=n;i++){//可以矩阵加速 但是这个数据范围不用
a[i][0]=a[i-1][2];
a[i][1]=(a[i-1][0]+a[i-1][2])%P;
a[i][2]=(a[i-1][1]+a[i-1][3])%P;
a[i][3]=a[i-1][1];
}
int ans=0;
for(int i=0;i<4;i++)ans=(ans+a[n][i])%P;
printf("%d\n",ans);
return 0;
}
分成四种结尾情况,分别是00,01,10,11
很神奇的最后是斐波那契数列