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. Web.config中设置启用webservice远程调试访问

    在.NET 中已经默认将webservice的远程调试功能关闭,有的时候我们需要远程调试程序的时候,就需要打开此功能我们只需在webservice的项目的中添web.config的<system ...

  2. hibernate学习(四)hibernate的一级缓存&快照

    缓存:提高效率 硬件的 CPU缓存   硬盘缓存   内存 软件的  io流缓存 hibernate  的一级缓存   也是为了操作数据库的效率. 证明一级缓存在  : Person p=sessio ...

  3. 阿里云ECS+CentOS 7.0+Docker+Redmine环境搭建

    前言 搭建Redmine环境可以选择使用分别安装Ruby+Rails+Redmine+MySQL的方式, 但是过程中需要解决各种扰人的依赖问题.Docker为我们提供的Plan B,方便,快捷. 安装 ...

  4. docker学习系列(三):docker镜像的分层结构

    docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...

  5. 为你揭露2018微信公开课pro的12个重点

    为你揭露2018微信公开课pro的12个重点 1月15日,微信公开课Pro版现场,微信又为我们带来了一些重磅消息,小程序依旧是本次微信公开课Pro的绝对重点.小编为大家整理了公开课的12个重点,带大家 ...

  6. js去重

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. [BZOJ1014] [JSOI2008] 火星人prefix (splay & 二分答案)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...

  8. [BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  9. telnet命令使用详解

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  10. 【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现

    原型Bean加载过程 之前的文章,分析了非懒加载的单例Bean整个加载过程,除了非懒加载的单例Bean之外,Spring中还有一种Bean就是原型(Prototype)的Bean,看一下定义方式: & ...