4417: [Shoi2013]超级跳马

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 410  Solved: 252
[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

一看n那么小m那么大就可以猜到是一个n*n级别的矩阵自乘m次

但这题还是比较难的,至少比一般的矩阵快速幂难

为方便先调换n和m:

设dp1[x][y]为到达第x行第y列+到达第x-2行第y列+…+到达第1(or2)行第y列的情况总数

dp2[x][y]为到达第x-1行第y列+到达第x-3行第y列+…+到达第2(or1)行第y列的情况总数

如果看不懂就看下面的图吧,假设每个格子上的数字是到达该格子的情况总数

n = 5,m = 5

1  2  3  4  5

1  3  5  7  9

2  4  7  9  9

3  5  6  7  8

1  9  8  9  9

那么dp1[5][4]就是上面红色数字之和,dp2[5][4]和dp1[4][4]就是上面蓝色数字之和

那么可以得到转移:

dp1[x][y] = dp1[x-1][y]+dp1[x-1][y-1]+dp1[x-1][y+1]+dp2[x-1][y]

dp2[x][y] = do1[x-1][y]

最后答案就是dp1[n][m]-dp2[n-1][m]

假设n=3,可以构造出下面矩阵

之后就是愉快的矩阵快速幂了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define mod 30011
int n;
typedef struct
{int i, j;int a[105][105];void init(){memset(a, 0, sizeof(a));for(i=1;i<=n/2;i++){for(j=1;j<=n/2;j++){if(abs(i-j)<=1)a[i][j] = 1;}}for(i=n/2+1;i<=n;i++)a[i][i-n/2] = a[i-n/2][i] = 1;}void unit(){memset(a, 0, sizeof(a));for(i=1;i<=n;i++)a[i][i] = 1;}
}Matrix;
Matrix Powto(Matrix p, int k);
Matrix Jjcf(Matrix p1, Matrix p2);
int main(void)
{int m;Matrix Jz, A, B;scanf("%d%d", &n, &m);if(m==1){if(n==1)printf("1\n");elseprintf("0\n");}else{n *= 2;Jz.init();A = Powto(Jz, m-2);B = Jjcf(A, Jz);printf("%lld\n", (B.a[1][n/2]-A.a[1][n]+mod)%mod);}return 0;
}Matrix Powto(Matrix p, int k)
{Matrix E;E.unit();while(k){if(k%2)E = Jjcf(E, p);p = Jjcf(p, p);k /= 2;}return E;
}Matrix Jjcf(Matrix p1, Matrix p2)
{Matrix pe;int i, j, k;memset(pe.a, 0, sizeof(pe.a));for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++)pe.a[i][j] = (pe.a[i][j]+p1.a[i][k]*p2.a[k][j])%mod;}}return pe;
}

bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)相关推荐

  1. bzoj 4417: [Shoi2013]超级跳马

    题意: 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.求跳法种数mod 30011. 题解: 看这种题应该是dp+矩乘. dp还是挺容易的,f[i ...

  2. HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  4. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

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

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

  6. 循环矩阵的快速幂(bzoj 2510: 弱题)

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 408  Solved: 218 [Submit][Status][Discuss] ...

  7. [矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

    矩阵快速幂习题 复习矩阵乘法及快速幂模板 乘法模板 快速幂模板 T1:Arc of Dream 题目 题解 code T2:Recursive sequence 题目 题解 code T3:233 M ...

  8. [BZOJ3240][Noi2013]矩阵游戏 快速幂

    当我知道这题矩阵可以用费马小定理搞快速幂的时候 我眼泪都要落下来了QAQ 首先求一发通项F[1][1]->F[2][1]的通项 然后写成A+B的形式 若a != 1 A = (a^(m-1))* ...

  9. ZCMU-1618-骨牌覆盖(矩阵乘法+快速幂)

    1618: 骨牌覆盖1 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 264  Solved: 124 [Submit][Status][Web Bo ...

最新文章

  1. python format 格式化字符串
  2. 腾讯科技改版 新闻帝国必经之路
  3. json支持utf-8_发票查重百科支持系统对接
  4. 关于sqlserver和oracle的一点感受
  5. ruby和python简单对比
  6. 关于使用ajax给全局变量赋值失败的问题
  7. 编程之美-从无头单链表中删除节点方法整理
  8. 使用Visual Studio 2017/C#开始使用Selenium 3.7
  9. 框架封装_重大突破,欧菲光成功研发半导体封装用高端引线框架
  10. Python与Json、pickle模块
  11. pandas从时间序列中判断是一周的第几天或星期几
  12. python经典例题及答案_python经典例题100道
  13. Gobelieve 架构(转载)
  14. 学习笔记 | NIPS 2021 regularization cocktail 调优的 MLPs 在表格数据上优于 GBDTs | Regularization is All Your Need
  15. this.className的使用
  16. webStrom 2018 激活破解(最新)
  17. Android 输入法增加语言
  18. 钉钉JSAPI鉴权,解决报错“签名校验无效”
  19. html视频不播放视频教程,html无法播放视频怎么办
  20. 美团动态线程池实践思路,开源了

热门文章

  1. ICRoute 语音识别芯片/声控芯片 用声音去沟通 LD332X系列语音识别芯片
  2. flex实现最后一个元素居右
  3. 移动web-使一个盒子水平垂直居中的六种方法
  4. element时间范围选择添加限制条件
  5. 【滑动窗口】leetcode209:长度最小的子数组
  6. 【链表】剑指offer:从尾到头打印链表
  7. 蓝桥2017真题剪邮票
  8. 使用python批量验证邮箱密码_python(Django 网页登陆账号、密码、邮箱验证)
  9. ES Filebeat 使用 Pipeline 处理日志中的 @timestamp
  10. android 内核裁剪概述,Android内核的编译与裁剪