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

(luogu)https://www.luogu.org/problemnew/show/P3990

题解: 一看就是矩乘优化dp.

每次跳奇数列?那么我们可以将列两两分组,以两列为一组作为矩阵要记录的状态。一个元素位于组内第一列说明它不可能再跳到这一组的第二列(为了避免算重)。转移矩阵的构造见代码。

那么我们用矩阵来表示转移方程: 设向量\(F[i]\)表示状态,\(A\)表示转移矩阵,\(F[i]=\sum^{i-1}_{j=1}F[j]\times A\)
作差分,\(F[i]-F[i-1]=F[i-1]\times A\), \(F[i]=F[i-1]\times (A+I)\)
注意这个递推式成立的条件是\(i\ge 3\), 即必须预处理出\(F[2]\)的值而不可以通过\(F[1]\)得出(想一想,为什么)。

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;inline int read()
{int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x;
}const int P = 30011;
const int N = 50;
struct Matrix
{int n;llong a[(N<<1)+3][(N<<1)+3];void output() {for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) printf("%lld ",a[i][j]); puts("");}}void clear(int _n) {n = _n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j] = 0ll;}void unitize() {for(int i=1; i<=n; i++) a[i][i] = 1ll;}Matrix operator *(const Matrix &arg) const{Matrix ret; ret.clear(n);for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){for(int k=1; k<=n; k++){ret.a[i][k] = (ret.a[i][k]+a[i][j]*arg.a[j][k])%P;}}}return ret;}
} trans,cur,ans;
int n;
llong m;void mquickpow(llong y)
{cur = trans;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ans = ans*cur;}cur = cur*cur;}
}int main()
{scanf("%d%lld",&n,&m);trans.clear(n<<1); cur.clear(n<<1); ans.clear(n<<1);for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(j>=i-1 && j<=i+1){trans.a[i][j+n]++;trans.a[i+n][j]++;}}}for(int i=1; i<=n+n; i++){for(int j=1; j<=n; j++){for(int k=1; k<=n; k++){if(k>=j-1 && k<=j+1){trans.a[i][k+n] += trans.a[i][j];}}}}ans = trans;for(int i=1; i<=n+n; i++) trans.a[i][i]++;mquickpow((m-3)>>1);if(m&1) printf("%lld\n",(ans.a[1][n]+ans.a[n+1][n]+ans.a[n+2][n])%P);else printf("%lld\n",(ans.a[1][n+n]+ans.a[n+1][n+n]+ans.a[n+2][n+n])%P);return 0;
}

BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)相关推荐

  1. bzoj 4417: [Shoi2013]超级跳马(矩阵合并+快速幂)

    4417: [Shoi2013]超级跳马 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 410  Solved: 252 [Submit][Stat ...

  2. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...

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

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

  4. 【bzoj3329】Xorequ 数位dp+矩阵乘法

    题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行 每行一个正整数N 输出 2*T行 第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 ...

  5. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  6. P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】

    正题 题目链接:https://www.luogu.com.cn/problem/P3193 题目大意 求有多少个长度为nnn的字符串不包含子串sss. 解题思路 考虑dpdpdp,用fi,jf_{i ...

  7. P5004-专心OI - 跳房子【dp,矩阵乘法】

    正题 题目链接:https://www.luogu.org/problemnew/show/P5004 题目大意 把NNN个无色格子排成一行,可以把某些格子染成黑色,但两个黑色格子之间必须至少有MMM ...

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

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

  9. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

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

最新文章

  1. Python真神奇,带你体验另类的“全自动编程”
  2. 新个人项目-- 拼图游戏
  3. 给用过SAP CRM中间件的老哥老姐们讲讲SAP CPI
  4. linux服务器配置与管理_服务器维护实施步骤
  5. 跳过人脸检测和关键点定位,Facebook等提出实时3D人脸姿态估计新方法
  6. 分块-洛谷P3203 [HNOI2010]BOUNCE 弹飞绵羊
  7. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)
  8. PHP数组和Json之间的转换
  9. 【南邮操作系统实验】银行家算法Java版
  10. HOOK大法实现不修改程序代码给程序添加功能
  11. python 贝塞尔曲线 反算控制点_根据贝塞尔曲线上的点反算t值
  12. 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore.nativeNewInstance(java.lang.S
  13. 下载腾讯视频极速版_怎么退出腾讯视频登录
  14. Oracle 后台进程初探
  15. 【业界新闻】浪潮高端存储系统技术发展及展望(上篇)
  16. FPGA系列7——Xilinx复数乘法器(Complex Multiplier v6.0)使用小结
  17. 解决 WPS 输入文字颜色无法改变并自带下划线的问题
  18. Synergistic Saliency and Depth Prediction for RGB-D Saliency Detection
  19. android版本60支持云闪付,云闪付app下载-云闪付 安卓版v8.0.5-PC6安卓网
  20. 吕本富:从平台经济到平台经济学

热门文章

  1. 二十二、“此生无悔入华夏,来世还在种花家”(2021.7.1)
  2. 机器学习实战指南:如何入手第一个机器学习项目?
  3. 批处理之列出目录下所有文件
  4. 贯穿你一生的14条社会生计
  5. [智力问答] 十个最难的字 你认识几个
  6. java可视化模板——java可视化操作步骤
  7. 指针:自定义函数length,调用它计算字符串的长度
  8. 操作系统(三十)避免死锁
  9. C语言再学习 -- 修改linux文件权限
  10. C语言再学习 -- 字符串和字符串函数