首页 > 其他分享 >【题解】走路

【题解】走路

时间:2024-08-02 19:05:44浏览次数:5  
标签:int 题解 向左走 向右走 text 向上 走路

I 题意简述

  • 从原点出发,一步只能向右走、向上走或向左走。恰好走 \(N\) 步且不经过已走的点共有多少种走法?

  • 多组数据,每行输入一个数 \(N\)。对于每一组测试数据,每行输出一个数,答案对 \(12345\) 取模。

  • 对于100%的数据,保证 \(1 \leq N \leq 1000\)。时间限制 \(1\text{s}\),空间限制 \(256\text{MB}\)。

II 分析

设 \(f_i\) 表示第 \(i\) 步之后所在的点有几种可能,\(a_i, b_i, c_i\) 分别表示第 \(i\) 步向上走、向左走,向右走的方案数。那么 \(f_i = a_i + b_i + c_i\).

容易发现,第 \(i - 1\) 步无论走到了哪里,接下来都可以向上走。所以有 \(a_i = f_{i - 1}\).

第 \(i\) 步如果要向左走,那么第 \(i - 1\) 步就只能是向左走或向上走,而不能是向右走,所以有 \(b_i = a_{i - 1} + b_{i - 1}\).

第 \(i\) 步如果要向右走,那么第 \(i - 1\) 步只可以向上或向右走,不能向左走,所以有 \(c_i = a_{i - 1} + c_{i - 1}\).

所以:\(\begin{aligned}f_i &\; = f_{i - 1} + a_{i - 1} + b_{i - 1} + a_{i - 1} + c_{i - 1} \\ &\; = f_{i - 1} + (a_{i - 1} + b_{i - 1} + c_{i - 1}) + a_{i - 1} \\ &\; = f_{i - 1} + f_{i - 1} + a_{i - 1} \\ &\; = 2f_{i - 1} + f_{i - 2}\end{aligned}\)

最后我们再定好范围,本题的递推式即为:\(f_i = 2f_{i - 1} + f_{i - 2} (i \geq 3)\). 按顺序计算即可。

III 代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1005, mod = 12345;
int n, f[N];
int main(){
    f[1] = 3, f[2] = 7;
    for(int i = 3; i <= 1000; i++)
        f[i] = (2 * f[i - 1] + f[i - 2]) % mod;
    while(scanf("%d", &n) != EOF)
        printf("%d\n", f[n]);
    return 0;
}

标签:int,题解,向左走,向右走,text,向上,走路
From: https://www.cnblogs.com/-Prulystic-/p/18339372

相关文章

  • 树(tree) - 题解(带权并查集)
    树(tree)时间限制:C/C++2000MS,其他语言4000MS内存限制:C/C++256MB,其他语言512MB描述给定一个\(n\)个结点,\(n−1\)条边的有根树。第\(i\)条边可以用(\(a_i,b_i\))来描述,它表示连接结点\(a_i\)和结点\(b_i\)的一条边,其中结点\(a_i\)是结点\(b_i\)的父节点。......
  • Luogu P5005 中国象棋 - 摆上马 / Luogu P8756 国际象棋 题解 [ 蓝 ] [ 状压 dp ] [
    国际象棋:模板棋盘状压。摆上马:需要点思维的棋盘状压,相比上一道题加了“蹩马脚”的设定。Easy_version:国际象棋概述一下此类棋盘问题的思路:用二进制数表示出棋盘上某一行的状态。用位运算预处理出合法的单行状态,以及需要用到的一些东西。用位运算判断前一行或者前几行能否......
  • Luogu P3959 宝藏 题解 [ 紫 ] [ 状压 dp ] [ 二项式定理 ]
    宝藏:一个对着蓝书代码调都能调两个小时的大毒瘤,但是思路还是很值得借鉴的,有普通状压和三进制状压两种做法,或者暴搜剪枝也可以(这里不介绍暴搜剪枝做法)。普通状压做法观察到\(n\le12\),首先想到状压。但考虑到普通的状压不太行,因为\(K\)这个数算在代价里,会导致这个dp有后效......
  • BZOJ2839/LG10596 集合计数 题解(二项式反演+扩展欧拉定理)
    题目大意:一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。为表述方便,不妨设这\(i\)个元素分别为\(1\simn\)。前置知识:二项式反演。考虑设\(g(......
  • 题解:CF1537E2 Erase and Extend (Hard Version)
    CF1537E2EraseandExtend题解分析通过观察题目,可以证明结果一定是由多次前缀复制得来的。题目要求你进行删和复制的操作,与其交替着操作,不如直接先删到最优的前缀再进行复制。现在就是要找最优的前缀。从头一位一位往后遍历。用\(l\)来存储目前最优前缀的长度,第\(i\)位......
  • 题解:CF1301B Motarack's Birthday
    CF1301DTimetoRun题解思维题。分析把一个格子视作一个点,每个点的度数都是偶数,所以这是一张欧拉图。而需要走遍整个方格图,可以证明只要\(k\)不超过\(4nm-2n-2m\)就一定有解。很明显存在很多种方案,这里我用的方案是:从左上角出发,向右走\(m-1\)步到头,再向左走\(m-1\)......
  • 题解:CF634A Island Puzzle
    CF634AIslandPuzzle题解分析由于我们仅能移动\(0\),所以其它数字的相对顺序较原来应该是不变的,所以我们从环中删除\(0\)再判断相对位置即可。还有需要注意的是本题是一个环,找到末尾需要用取模操作回到开头继续比较。示例代码#include<bits/stdc++.h>usingnamespacest......
  • 题解:CF718A Efim and Strange Grade
    CF718AEfimandStrangeGrade题解算法贪心+模拟思路分析显然,要最优每一次进位就只能五入不能四舍。而且当我们五入时,要取位数最高的。比如说\(1.3535\),我们有两种进位方式,一种是进位成\(1.4\),一种是进位成\(1.354\),显然前者更优。那这道题给的次数有啥用呢?考虑一种“......
  • 题解:CF1301D Time to Run
    CF1301DTimetoRun题解思维题。分析把一个格子视作一个点,每个点的度数都是偶数,所以这是一张欧拉图。而需要走遍整个方格图,可以证明只要\(k\)不超过\(4nm-2n-2m\)就一定有解。很明显存在很多种方案,这里我用的方案是:从左上角出发,向右走\(m-1\)步到头,再向左走\(m-1\)......
  • 题解:CF771A Bear and Friendship Condition
    CF771ABearandFriendshipCondition题解算法并查集,图的基本性质分析题目意思是,一旦有一些点联通,那么这些点必须两两直接相连。换句话讲,就是图中的每个联通块都是完全图。所谓完全图,就是图中的每个点都两两相连,假设一个完全图有\(n\)个点,那么我们可以通过乘法原理算出这......