题目描述

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

输入

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

输出

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

样例输入

3 5

样例输出

10


题解

矩阵乘法

设 $f[i][j]$ 表示跳到 $(i,j)$ 的方案数,那么 $f[i][j]=\sum\limits_{k=1}^{\frac n2}f[i-2k+1][j-1]+f[i-2k+1][j]+f[i-2k+1][j+1]$。

那么我们维护两个前缀和:一个是与当前列相差为偶数的 $s1[i][j]$ 、一个是相差为奇数的 $s2[i][j]$ 。

当转移时如下图(红色为相差为偶数的 $s1$ ,蓝色为相差为奇数的 $s2$ ):

显然多出来的一个体现在 $s1[i+1]$ 上,与 $i+1$ 相差为奇数就与 $i$ 相差为偶数,由 $s1[i]$ 转移;而 $s2[i+1]$ 相对于 $s1[i]$ 没有改变。

于是就有 $s1[i+1][j]=s2[i][j]+s1[i][j-1]+s1[i][j]+s1[i][j+1]\ ,\ s2[i+1][j]=s1[i][j]$

发现这个式子可以使用矩阵乘法来加速递推,因此直接矩乘即可。最后的答案就是前缀相减 $s1[m][n]-s2[m-1][n]$

时间复杂度 $O((2n)^3\log m)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 30011
using namespace std;
int n;
struct data
{
int v[105][105];
data() {memset(v , 0 , sizeof(v));}
int *operator[](int a) {return v[a];}
data operator*(data &a)
{
data ans;
int i , j , k;
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
for(k = 1 ; k <= n ; k ++ )
ans[i][j] = (ans[i][j] + v[i][k] * a[k][j]) % mod;
return ans;
}
}I , A , B;
data pow(data x , int y)
{
data ans;
int i;
for(i = 1 ; i <= n ; i ++ ) ans[i][i] = 1;
while(y)
{
if(y & 1) ans = ans * x;
x = x * x , y >>= 1;
}
return ans;
}
int main()
{
int m , i;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) I[i][i] = I[i + n][i] = I[i][i + n] = 1;
for(i = 1 ; i < n ; i ++ ) I[i + 1][i] = I[i][i + 1] = 1;
n <<= 1 , A = pow(I , m - 2) , B = A * I;
printf("%d\n" , (B[1][n >> 1] - A[1][n] + mod) % mod);
return 0;
}

【bzoj4417】[Shoi2013]超级跳马 矩阵乘法的更多相关文章

  1. BZOJ4417: [Shoi2013]超级跳马

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

  2. [BZOJ 4417][Shoi2013]超级跳马

    4417: [Shoi2013]超级跳马 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 379  Solved: 230[Submit][Status ...

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

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

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

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

  5. P3990 [SHOI2013]超级跳马

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

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

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

  7. [Shoi2013]超级跳马(DP+矩阵乘法)

    设f[i][j]表示方案数,显然有一个O(m2n)的暴力DP法,但实际上可以按距离当前位置的奇偶性分成s1[i][j]和s2[i][j],然后这个暴力DP可以优化到O(nm)的暴力.于是有这样的递推式 ...

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

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

  9. [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马

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

随机推荐

  1. LeetCode: 61. Rotate List(Medium)

    1. 原题链接 https://leetcode.com/problems/rotate-list/description/ 2. 题目要求 给出一个链表的第一个结点head和正整数k,然后将从右侧开 ...

  2. CakePHP 查询总结

    返回 $this->Post->buildQuery(); 返回: Array ( [conditions] => [fields] => [joins] => Arra ...

  3. js中call()方法和apply方法的使用

    1. 方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  4. Nginx+Tomcat多站点访问默认主页问题-狒狒完美解决-Q9715234

    <Engine name="Catalina" defaultHost="www.abc.com"> <Host name="www ...

  5. 离线安装Sharepoint工具

    1. 首先安装操作系统,Windows Server 2008 R2,可以是企业版,也可以是数据中心版.然后再安装上SP1. 2. 在"服务管理"里面,添加角色,安装IIS.    ...

  6. How To Install Apache Tomcat 7 on CentOS 7 via Yum

    摘自:https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-centos-7-via-y ...

  7. 「日常训练&知识学习」树的分块(王室联邦,HYSBZ-1086)

    题意与分析 这题的题意就是树分块,更具体的看题目(中文题). 学习这一题是为了树的分块,为树上莫队做铺垫. 参考1:https://blog.csdn.net/LJH_KOQI/article/det ...

  8. eclipse注释快捷键

    1.单行注释 注释: ctrl + / 取消注释: ctrl + / 多行注释 注释: ctrl shift + / 取消注释: ctrl shift + \

  9. 标注点(Labeled Point)

    标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...

  10. 实现Bidirectional LSTM Classifier----深度学习RNN

    双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster.Paliwal,1997年首次提出,和LSTM同年.Bi-RNN,增 ...