codeforces-474D-Flowers
2015-11-05 19:07
363 查看
codeforces-474D-Flowers
[code] time limit per test1.5 seconds memory limit per test256 megabytes
We saw the little game Marmot made for Mole’s lunch. Now it’s Marmot’s dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flowers. Therefore a dinner can be represented as a sequence of several flowers, some of them white and some of them red.
But, for a dinner to be tasty, there is a rule: Marmot wants to eat white flowers only in groups of size k.
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 modulo 1000000007 (109 + 7).
Input
Input contains several test cases.
The first line contains two integers t and k (1 ≤ t, k ≤ 105), where t represents the number of test cases.
The next t lines contain two integers ai and bi (1 ≤ ai ≤ bi ≤ 105), describing the i-th test.
Output
Print t lines to the standard output. The i-th line should contain the number of ways in which Marmot can eat between ai and bi flowers at dinner modulo 1000000007 (109 + 7).
input
3 2
1 3
2 3
4 4
output
6
5
5
Note
For K = 2 and length 1 Marmot can eat (R).
For K = 2 and length 2 Marmot can eat (RR) and (WW).
For K = 2 and length 3 Marmot can eat (RRR), (RWW) and (WWR).
For K = 2 and length 4 Marmot can eat, for example, (WWWW) or (RWWR), but for example he can’t eat (WWWR).
题目链接:cf-474D
题目大意:问存在多少种,长度为n及小于n的序列满足条件:k个W一组
题目思路:dp。刚开始我的思路是dp[i][j],表示长度为i,j组k长度的W的个数。发现爆空间。
改成dp[i]一维的。有两种情况:1.dp[i] = dp[i - 1]增加一个R,2.dp[i] = dp[i - k]增加一组W。
另外需要注意,答案相减取余时可能是负数。
以下是代码:
[code]#include <vector> #include <map> #include <set> #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <string> #include <cstring> using namespace std; #define MOD 1000000007 int dp[100001]; int t,k; //int ans[100010]; void solve() { dp[0] = 1; for (int i = 1; i <= 100000; i++) { dp[i] = dp[i - 1]; if (i >= k) dp[i] += dp[i - k]; dp[i] %= MOD; // for (int j = 0; j <= i/k; j++) // { // if (i >= k && j > 0 && (i > j * k)) // dp[i][j] = (d[i][j] + dp[i - 1][j] + dp[i - k][j - 1]) % MOD; // // else if (i < j * k) dp[i][j] = 0; // // else // dp[i][j] = 1; // } } for(int i = 1; i <= 100000; i++) { dp[i] += dp[i - 1]; dp[i] %= MOD; // if (i < k) ans[i] = 1 + ans[i - 1]; // else // { // ans[i] = ans[i - 1]; // for (int j = 0; j <= i/k; j++) // { // ans[i] += dp[i][j]; // } // } } } int main(){ while(cin >> t >> k) { solve(); while(t--) { int a,b; scanf("%d%d",&a,&b); int last = (dp[b] - dp[a - 1] + MOD) % MOD; printf("%d\n",last); } } return 0; }
相关文章推荐
- HDFS原理分析:基本概念
- 将整数索引转换为Excel对于的列名,比如输入1,返回“A”,输入27,返回“AA”
- Vmware克隆
- 冒泡排序文法
- linux下的用户管理(二)
- Oracle——热备份
- 统计并保存叶子节点(二叉树)
- hdu 3616 Milking Time dp 离散化
- PHP面向对象中类方法的两种类型:2、对象类型(获得提示)
- Change the user name in win
- 云巴-JavaScript API测试与实例
- linux之cp/scp命令+scp命令详解
- elasticsearch+logstash+kibana安装配置
- 软件的生命周期及周期模型
- SharedPreferences工具类
- 位域妙用
- android之AsyncTask
- linux免密码登录
- android入门级之资源的使用--图片资源--控件ImageView
- WebService框架JWS、Axis2、XFire、CXF的区别