牛客网暑期ACM多校训练营(第二场) 题解 A run 递推 dp
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网
White Cloud can walk 1 meters or run k meters per second.
Since White Cloud is tired,it can't run for two or more continuous seconds.
White Cloud will move L to R meters. It wants to know how many different ways there are to achieve its goal.
Two ways are different if and only if they move different meters or spend different seconds or in one second, one of them walks and the other runs.
输入描述:
The first line of input contains 2 integers Q and k.Q is the number of queries.(Q<=100000,2<=k<=100000)
For the next Q lines,each line contains two integers L and R.(1<=L<=R<=100000)
输出描述:
For each query,print a line which contains an integer,denoting the answer of the query modulo 1000000007.
输入例子:
3 3
3 3
1 4
1 5
输出例子:
2
7
11
-->
分析:题目让我们求从0到(l,r)的所有可能走法,每次可以走1或者k,但是走了k必须停一次
从0到x(1<=x<=n)每次走1或者k,不考虑停一次的种数符合递推式:
f(x) = f(x-1) + f(x-k)(x>=k) f(x) = 1(x>=1) f(0) = 0(x=0)
比赛时我是看其中k=2时符合斐波拉数列,于是想到了递推,然后推了3写出了递推式
然后我们看连续走k的情况,可以发现:
g(x) = 0(x<2*k) g(x) = x-k+1(2*k<=x<=3*k-1) g(x) = g(x-1) + g(x-k+1) (x>=3*k)
最后到x符合情况的种数就是:f(x)-g(x)
而每次要求到(l,r),我们可以先算个前缀和,在开始打表出所有值就行
当然k=1的时候,因为走和跑不同,所以不是每种都为1,计算一下可以发现符合斐波拉数列(可以考虑把走看成1,跑看成0,然后求在1中间插0的排列数)
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 1e5;
const int mod = 1e9 + 7;
typedef long long ll;
ll a[10*maxn+10], sum[10*maxn+10], b[10*maxn+10];
int main() {
std::ios::sync_with_stdio(false);
ll n, k;
cin >> n >> k;
if( k != 1 ) {
sum[0] = 0;
for( ll i = 1; i <= k-1; i ++ ) {
a[i] = 1;
sum[i] = sum[i-1] + a[i];
}
a[k] = 2;
sum[k] = sum[k-1] + a[k];
ll num = 1;
for( ll i = 2*k; i <= 3*k-1; i ++ ) {
b[i] = num;
num ++;
}
for( ll i = k+1; i <= maxn; i ++ ) {
a[i] = ( a[i-1] + a[i-k] ) % mod;
if( i >= 3*k ) {
b[i] = ( b[i-1] + b[i-k+1] ) % mod;
sum[i] = ( sum[i-1] + ( a[i] - b[i] ) % mod ) % mod;
} else if( i < 3*k && i >= 2*k ) {
sum[i] = ( sum[i-1] + ( a[i] - b[i] ) % mod ) % mod;
} else {
sum[i] = ( sum[i-1] + a[i] ) % mod;
}
}
} else {
sum[1] = 2, sum[2] = 5;
a[1] = 2, a[2] = 3;
for( ll i = 3; i <= maxn; i ++ ) {
a[i] = ( a[i-1] + a[i-2] ) % mod;
sum[i] = ( sum[i-1] + a[i] ) % mod;
}
}
while( n -- ) {
ll le, ri;
cin >> le >> ri;
if( le == 1 ) {
cout << sum[ri] << endl;
} else {
cout << ( sum[ri] - sum[le-1] + mod ) % mod << endl;
}
}
return 0;
}
再贴一个dp的做法
f[i][0/1]表示已经跑了i米,最后一步是跑还是走的方案数。 f[i][1]=f[i-k][0],f[i][0]=f[i-1][0]+f[i-1][1] 答案即为l到r的f[i][0]和f[i][1]的累加 ,我们只需记录前缀和即可
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 1e5;
const int mod = 1e9 + 7;
typedef long long ll;
ll sum[2*maxn], dp[2*maxn][3];
int main() {
std::ios::sync_with_stdio(false);
ll n, k, le, ri;
cin >> n >> k;
memset( dp, 0, sizeof(dp) );
memset( sum, 0, sizeof(sum) );
sum[0] = 0, dp[0][0] = 0, dp[0][1] = 0;
for( ll i = 1; i <= k; i ++ ) {
dp[i][0] = 1;
if( i == k ) {
dp[k][1] = 1;
}
sum[i] = ( dp[i][0] + dp[i][1] + sum[i-1] ) % mod;
}
for( ll i = k+1; i <= maxn; i ++ ) {
dp[i][0] = dp[i-1][0] + dp[i-1][1], dp[i][1] = dp[i-k][0];
sum[i] = ( sum[i-1] + dp[i][1] + dp[i][0] ) % mod;
}
while( n -- ) {
cin >> le >> ri;
cout << ( sum[ri] - sum[le-1] + mod ) % mod << endl;
}
return 0;
}
牛客网暑期ACM多校训练营(第二场) 题解 A run 递推 dp的更多相关文章
- 牛客网暑期ACM多校训练营 第九场
HPrefix Sum study from : https://blog.csdn.net/mitsuha_/article/details/81774727 k较小.分离x和k. 另外的可能:求a ...
- 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)
链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...
- 牛客网暑期ACM多校训练营(第五场):F - take
链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献)
牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献) 链接:https://ac.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy ha ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 牛客网暑期ACM多校训练营(第七场)Bit Compression
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...
- 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...
- 牛客网暑期ACM多校训练营(第九场) A题 FWT
链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...
随机推荐
- DHCP服务器的搭建及抓包分析DHCP的实现
原文:http://blog.51cto.com/liwenhui/105129 1.环境搭建: DC&DHCP SERVER IP:192.168.1.254 ( 这是一台D ...
- 基于 HTML5 WebGL 的加油站 3D 可视化监控
前言 随着数字化,工业互联网,物联网的发展,我国加油站正向有人值守,无人操作,远程控制的方向发展,传统的人工巡查方式逐渐转变为以自动化控制为主的在线监控方式,即采用数据采集与监控系统 SCADA.SC ...
- Windbg程序调试系列-索引篇
最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...
- 【Java例题】2.8 解一元二次方程
8.解一元二次方程. 输入一元二次方程的a,b,c三个系数,解一元二次方程 ax^2+bx+c=0,输出两个根 package study; import java.util.Scanner; pub ...
- MyBatis之foreach
foreach foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内.它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符.这个元素是很智能的,它不会偶 ...
- java多线程基础(一)--sleep和wait的区别
sleep和wait的区别有: 1.这两个方法来自不同的类分别是Thread和Object: 2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得线程可以使用同步控制块或者方法: 3.w ...
- Ubuntu 18.04 LTS版本 GoldenDict安装与配置
为何安装? GoldenDict是一款Linux下很好用的词典软件,其具有的关于词典的裁剪功能使得用户能够方便地对各种词典进行添加或删除,其具有的屏幕取词功能能够帮助用户方便地进行翻译,其具有的网络源 ...
- Netty源码分析--内存模型(上)(十一)
前两节我们分别看了FastThreadLocal和ThreadLocal的源码分析,并且在第八节的时候讲到了处理一个客户端的接入请求,一个客户端是接入进来的,是怎么注册到多路复用器上的.那么这一节我们 ...
- [GO语言的并发之道] Goroutine调度原理&Channel详解
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go ...
- OCP培训 Oracle 12c/18c/19c OCP认证实战培训【送OCP优惠名额】
一.OCP培训 Oracle 12c/18c/19c OCP认证全套实战培训[送OCP优惠名额],本课程内容 课程目标: 为满足想参加Oracle OCP考证的学员,风哥设计的一套比较全面OCP实战培 ...