01序列2
01序列2
题目描述
又是大家最喜欢的01序列问题了呢
这次的问题非常的简单,cc觉得一个01序列中两个1之间至少要有\(k\)个00,现在他要构造出一个长度为\(n\)的01序列,请问他有多少种不同的构造方法
这个数字可能会非常大,请你对\(109+7\)取模
输入格式
一行,给出两个整数\(n,k\)
输出格式
一个整数,代表不同的构造方法数
数据范围
\(1≤n≤10^6\)
\(0≤k<n\)
样例输入
4 2
样例输出
6
题目分析
假设\(a_i\)为第i位为1,后面都为0的可能性,那么\(a_i\)可以有前k位得到,做个前缀合维护即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+7;
long long a[N],sum[N],mod=1e9+7;
int main() {
int n,k;
cin >> n >> k;
for(int i = 1 ; i <= n ; i++)
a[i] = 1,sum[i] = (sum[i-1]+1)%mod;
for(int i = k+1 ; i <= n ; i++) {
a[i] +=sum[i-k-1]-sum[0];
a[i] %= mod;
sum[i] = (sum[i-1]+a[i])%mod;
}
long long ans = 1;
cout << (ans + sum[n])%mod;
return 0;
}

浙公网安备 33010602011771号