题目:Flowers
题意:
一个01序列,问长度在 a[ i ] ~ b[ i ] 有多少个不同的序列,满足1成段出现(长度为K)。
解析:
计数类DP。
常规思路:将区间和转化成前缀和相减。
令 f[ i ] 表示长度为 i 的序列的种数,易得转移方程:
代码:
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int Max=100010;
int n,m;
int f[Max];
inline int get_int()
{
int x=0;char c;
for(c=getchar();!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x;
}
inline void print(int x)
{
if(x>9) print(x/10);
putchar('0'+x%10);
}
inline void add(int &a,int b)
{
a=(a+b)>=mod?a+b-mod:a+b;
}
inline void pre()
{
f[0]=1;
for(int i=1;i<=100000;i++)
{
add(f[i],f[i-1]);
if(i>=m) add(f[i],f[i-m]);
}
f[0]=0;
for(int i=2;i<=100000;i++) add(f[i],f[i-1]);
}
int main()
{
n=get_int(),m=get_int();
pre();
while(n--)
{
int l=get_int(),r=get_int();
print((f[r]-f[l-1]+mod)%mod),putchar('\n');
}
return 0;
}