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;
}
posted @ 2022-04-04 23:08  seekerHeron  阅读(137)  评论(0)    收藏  举报