Flowers CodeForces - 474D

原题链接
考察:线性dp
思路:
  将\(k\)个连续的点当作\(a\),一个点当作\(b\).假设当前有\(x\)个点,那么我们要用\(a,b\)组成\(x\)
\(\quad \quad \quad f[x] = f[x-1]+f[x-k]\)

Code

#include <iostream> 
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 100010,M = 1000000007;
int f[N],k;
void init()
{
	f[0] = 1;
	for(int i=1;i<N;i++)
	{
		f[i] = f[i-1]+1;
		if(i>=k) f[i]=(f[i]+f[i-k])%M;
		f[i] %= M;
	}
}
int main() 
{
	int T;
	scanf("%d%d",&T,&k);
	init();
	while(T--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",((LL)f[r]-f[l-1]+M)%M);
	}
	return 0;
}

posted @ 2021-09-27 23:48  acmloser  阅读(33)  评论(0编辑  收藏  举报