时间:2021-07-01 10:21:17 帮助过:3人阅读
But, for a dinner to be tasty, there is a rule: Marmot wants to eat white flowers only in groups of sizek.
Now Marmot wonders in how many ways he can eat between a and b flowers. As the number of ways could be very large, print it modulo1000000007 (109?+?7).
Input
Input contains several test cases.
The first line contains two integers t andk (1?≤?t,?k?≤?105), wheret represents the number of test cases.
The next t lines contain two integers ai andbi (1?≤?ai?≤?bi?≤?105), describing the i-th test.
Output
Print t lines to the standard output. Thei-th line should contain the number of ways in which Marmot can eat betweenai andbi flowers at dinner modulo1000000007 (109?+?7).
Sample test(s)
Input
3 21 32 34 4
Output
655
Note
考虑第n个。假如n是小于k的,那么只能都是是R,也就是只有一种情况。假如大于等于k,如果第n个是W,那么从n-k+1到n全部为W,如果第n个是R,那么数量就是前n-1个的数量。
dp[n] = 1; (0<= n < k)
dp[n] = dp[n-1] + dp[n-k]; (n >= k)
#include#include #include #include #include #include #include #define mem(f) memset(f,0,sizeof(f))#define M 100005#define mod 1000000007#define MAX 0X7FFFFFFF#define maxn 100005#define lson o<<1, l, m#define rson o<<1|1, m+1, rusing namespace std;typedef long long LL;int n = maxn, k, t, a, b, dp[maxn], sum[maxn];int main(){ scanf("%d%d", &t, &k); for(int i = 0; i < k; i++) dp[i] = 1; for(int i = k; i < n; i++) dp[i] = (dp[i-1] + dp[i-k])%mod; for(int i = 1; i < n; i++) sum[i] = (sum[i-1] + dp[i])%mod; while(t--) { scanf("%d%d", &a, &b); printf("%d\n", ((sum[b]-sum[a-1])%mod+mod)%mod ); } return 0;}
??