4417: [Shoi2013]超级跳马

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 379  Solved: 230
[Submit][Status][Discuss]

Description

现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。跳越期间,马不能离开棋盘。例如,当n = 3, m = 10时,下图是一种可行的跳法。
 
试求跳法种数mod 30011。

Input

仅有一行,包含两个正整数n, m,表示棋盘的规模。

Output

仅有一行,包含一个整数,即跳法种数mod 30011。

Sample Input

3 5

Sample Output

10

HINT

对于100%的数据,1 ≤ n ≤ 50,2 ≤ m ≤ 10^9

题解

首先我们发现由于某个点的状态可以从与它所在列的编号的奇偶性不同的所有列转移, 所以这应该是一个前缀和.

而第 $i$ 列的前缀和可以从前一列转移, 但奇数列与偶数列所转移的位置并不同, 所以转移过程中需要记录两个参考向量. 这样的话转移过程中的向量维数就是 $2n$ , 我们就需要一个 $2n\times 2n$ 的矩阵了. 我的转移矩阵大概长这样:

其中左上部分用于统计答案, 左下部分把奇偶性相同的列也加和起来, 右上部分用于把上一列答案下推一列.

然后最后一轮的时候要把左下和右上部分置零(其实主要是左下部分置零, 因为奇偶性相同的列不能再加入答案了)

A掉之后整个人都赛艇了2333333

参考代码

GitHub

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MOD=; int n,m; struct Matrix{
int n;
int m[][];
Matrix(int n=){
this->n=n;
memset(m,,sizeof(m));
}
}; struct Vector{
int n;
int v[];
Vector(int n=){
this->n=n;
memset(v,,sizeof(v));
}
}; Vector operator* (const Vector& v,const Matrix& m){
Vector ans(v.n);
for(int i=;i<=v.n;i++)
for(int j=;j<=v.n;j++)
(ans.v[j]+=1ll*v.v[i]*m.m[i][j])%=MOD;
return ans;
} Matrix operator* (const Matrix& a,const Matrix& b){
Matrix ans(a.n);
for(int i=;i<=a.n;i++)
for(int j=;j<=a.n;j++)
for(int k=;k<=a.n;k++)
(ans.m[i][j]+=1ll*a.m[i][k]*b.m[k][j])%=MOD;
return ans;
} int main(){
scanf("%d%d",&n,&m);
Vector v(*n);
Matrix mx(*n);
v.v[]=;
for(int i=;i<=n;i++){
mx.m[i+n][i]=;
mx.m[i][i+n]=;
for(int j=std::max(,i-);j<=std::min(n,i+);j++){
mx.m[i][j]=;
}
}
m-=;
while(m>){
if((m&)!=){
v=v*mx;
}
mx=mx*mx;
m>>=;
}
memset(mx.m,,sizeof(mx.m));
for(int i=;i<=n;i++){
for(int j=std::max(,i-);j<=std::min(n,i+);j++){
mx.m[i][j]=;
}
}
if((m&)==)
v=v*mx;
printf("%d\n",v.v[n]);
return ;
}

Backup

[BZOJ 4417][Shoi2013]超级跳马的更多相关文章

  1. 洛谷 P3990 [SHOI2013]超级跳马 解题报告

    P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...

  2. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  3. BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4417 (luogu)https://www.luogu.org/prob ...

  4. BZOJ4417: [Shoi2013]超级跳马

    Description 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可 ...

  5. 【BZOJ4417】: [Shoi2013]超级跳马

    题目链接: 传送. 题解: 矩阵快速幂优化DP. 先考虑$nm^2$DP,设$f_{(i,j)}$表示从$1,1$到$i,j$的方案,显然这个方程和奇偶性有关,我们考虑某列的$i$同奇偶性的转移和奇偶 ...

  6. Luogu P3990 [SHOI2013]超级跳马

    这道题还是一道比较不可做的矩阵题 首先我们先YY一个递推的算法:令f[i][j]表示走到第i行第j列时的方案数,那么有以下转移: f[i][j]=f[i-1][j-2*k+1]+f[i+1][j-2* ...

  7. 【bzoj4417】[Shoi2013]超级跳马 矩阵乘法

    题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法.   ...

  8. P3990 [SHOI2013]超级跳马

    传送门 首先不难设\(f[i][j]\)表示跳到\((i,j)\)的方案数,那么不难得到如下转移 \[f[i][j]=\sum\limits_{k=1}^{\frac n2}f[i-2k+1][j-1 ...

  9. [SHOI2013]超级跳马

    题目描述 现有一个n 行m 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.试求跳法种数mod 30011. 输入输出格式 输入格式: ...

随机推荐

  1. ORA-00904:标识符无效

    1.错误描述 ORA-00904:"TTT"."RN":标识符无效 00904 . 00000 - "%s:invalid identifier&qu ...

  2. 学习笔记:webpack深入与实践(一)

    一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...

  3. monkey日志分析

    Monkey测试的og分析,我们可以通过几个关键词来判断测试是否通过.1)Monkey finished打开LOG,查看log的最下端,是否有类似以下字段:## Network stats: elap ...

  4. 实例 find

    2011/09/08 12:00 时间开始找一天內的,会列出 2011/09/07 12:00 ~ 2011/09/08 12:00 时间內的文件3天前被改动过的文件 (前第三天以前 → 2011/0 ...

  5. C#接口--C#基础

    1.接口的声明 接口:描述属于任何类或者结构的一组相关功能,是一种规范.功能 组成:属性.方法.事件.索引或者这四种成员的任意组合构成 基本知识点: 1)接口默认的权限修饰符是:public,不允许加 ...

  6. SpringBoot 文件上传临时文件路径问题

    年后放假回来,一向运行OK的项目突然图片上传不了了,后台报错日志如下: java.io.IOException: The temporary upload location [/tmp/tomcat. ...

  7. 【BZOJ1007】水平可见直线(单调栈)

    [BZOJ1007]水平可见直线(单调栈) 题解 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的 ...

  8. 快速开发 HTML5 WebGL 的 3D 斜面拖拽生成模型

    前言 3D 场景中的面不只有水平面这一个,空间是由无数个面组成的,所以我们有可能会在任意一个面上放置物体,而空间中的面如何确定呢?我们知道,空间中的面可以由一个点和一条法线组成.这个 Demo 左侧为 ...

  9. 【learning】莫比乌斯反演

    吐槽 额其实这个东西的话..好像缠着机房里面的dalao们给我讲过好多遍了然后.. 拖到现在才搞懂也是服了qwq(可能有个猪脑子) 感觉就是主要几条式子然后疯狂换元换着换着就化简运算了? 草稿纸杀手q ...

  10. git团队协作

    hi,team,我们目前使用的是git做项目管理,它是非常优秀的版本控制工具,使用好可以极大提高我们团队开发效率.但是,出现不必要的冲突和代码丢失就要费时解决这些可避免的问题. git开发流程 这个流 ...