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