description


analysis

  • 矩阵乘法好题

  • 最朴素的\(10pts\)的\(f[i][j]\)容易\(DP\),但是是\(O(nm^2)\)的复杂度

  • 于是把\(10\)分的\(DP\)写出来,就可以知道\(f[i][j]+=f[k][l]\)的部分可以搞前缀和优化,\(O(nm)\)有\(50pts\)

  • 这个要先弄懂才可以继续搞矩乘

  • 可以分成奇数列和偶数列分别\(DP\),设\(f[i],g[i]\)分别表示某奇数列的第\(i\)和偶数列的第\(i\)的方案数的前缀和

  • \(f[i]\)和\(g[i]\)都要加上第\(i\)行前面与他奇偶性相同的方案数方便转移,具体见代码

  • 于是\(f[i]=g[i-1]+g[i]+g[i+1],g[i]=f[i-1]+f[i]+f[i+1]\)(注意边界的两个点),可以矩乘优化了

  • 具体就是,初始矩阵写成前一半是\(f[1..n]\),后一半是\(g[1..n]\)

  • 想办法矩乘转移到\((g[1..n],f’[1..n])\),这里举\(n=3\)的例子

  • \((1,0,0,1,1,0)*F=(1,1,0,3,2,1)\),因为打表发现\(\left(
    \begin{matrix}
    1,1,2...\\
    0,1,2... \\
    0,0,1...
    \end{matrix}
    \right)\),这个\(3\)加上了前面的那个\(1\)

  • 于是由\((f[i-1],f[i],f[i+1],g[i-1],g[i],g[i+1])*F=(g[i-1],g[i],g[i+1],f’[i-1],f’[i],f’[i+1])\)推矩阵

  • 注意\(f[i]=g[i-1]+g[i]+g[i+1]\),推出来大概就是\(\left(
    \begin{matrix}
    0,0,0,1,0,0\\
    0,0,0,0,1,0 \\
    0,0,0,0,0,1\\
    1,0,0,1,1,0\\
    0,1,0,1,1,1\\
    0,0,1,0,1,1\\
    \end{matrix}
    \right)\)

  • \(n=10\)的矩阵长这样

  • 于是就可以直接上矩乘搞了,答案就为最后两位的和

code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 55
#define mod 30011
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll ia=;i>=b;--i) using namespace std; ll n,m; struct matrix
{
ll a[MAXN<<1][MAXN<<1],n,m;
matrix(){memset(a,0,sizeof(a)),n=m=0;}
matrix(ll x,ll y){memset(a,0,sizeof(a)),n=x,m=y;}
}f,ans,ans1,f1;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline matrix operator*(matrix a,matrix b)
{
matrix c(a.n,b.m);
fo(i,1,a.n)
fo(j,1,b.m)
fo(k,1,a.m)(c.a[i][j]+=a.a[i][k]*b.a[k][j])%=mod;
return c;
}
inline matrix pow(matrix x,ll y)
{
matrix z=x;
while (y)
{
if (y&1)z=z*x;
y>>=1,x=x*x;
}
return z;
}
int main()
{
n=read(),m=read();
ans=ans1=matrix(1,n<<1),f=f1=matrix(n<<1,n<<1);
ans.a[1][1]=ans.a[1][n+1]=ans.a[1][n+2]=f.a[n+1][n+1]=1;
fo(i,n+2,n<<1)f.a[i][i]=f.a[i-1][i]=f.a[i][i-1]=1;
fo(i,1,n)f.a[i][n+i]=f.a[n+i][i]=1;
f1=pow(f,m-3),ans1=ans*f1;
printf("%lld\n",(ans1.a[1][n-1]+ans1.a[1][n])%mod);
return 0;
}

【JZOJ3294】【BZOJ4417】【luoguP3990】超级跳马的更多相关文章

  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. 【BZOJ4417】: [Shoi2013]超级跳马

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

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

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

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

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

  8. Luogu P3990 [SHOI2013]超级跳马

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

  9. P3990 [SHOI2013]超级跳马

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

随机推荐

  1. 安装 sysbench的 报错 /usr/bin/ld: cannot find -lmysqlclient_r 解决办法

    首先你需要找到这个库的位置 一般找的话需要将lib 给加上(注意:我这里是 -lmysqlclient_r 的报错,于是我找就找 libmysqlclient_r ) find / -name lib ...

  2. 【JS学习】慕课网9-14 删除结点操作的问题

    试一试,定义clearText()函数,完成节点内容的删除. 1. 删除该节点的内容,先要获取子节点. 2. 然后使用循环遍历每个子节点. 3. 使用removeChild()删除节点. 特别要注意的 ...

  3. Java中有几种类型的流?

    (1)字节流 InputStream/OutputStream ①FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作 ②BufferedInputStre ...

  4. 文件系统类型(ext4、ntfs)

    Linux 1.Linux:存在几十个文件系统类型:ext2,ext3,ext4,xfs,brtfs,zfs(man 5 fs可以取得全部文件系统的介绍) 不同文件系统采用不同的方法来管理磁盘空间,各 ...

  5. CSS3 @media 查询(制作响应式布局)

    这里简单说明一下@media 查询. 详细说明文档:http://www.runoob.com/cssref/css3-pr-mediaquery.html 使用 @media 查询,你可以针对不同的 ...

  6. Service6

    rsync同步操作 同步 : 只传输变化的数据     复制:完整的传输 • 命令用法– rsync [选项...] 源目录 目标目录 • 同步与复制的差异– 复制:完全拷贝源到目标– 同步:增量拷贝 ...

  7. 学习Caffe(一)安装Caffe

    Caffe是一个深度学习框架,本文讲阐述如何在linux下安装GPU加速的caffe. 系统配置是: OS: Ubuntu14.04 CPU: i5-4690 GPU: GTX960 RAM: 8G ...

  8. Delphi 判断某个系统服务是否存在及相关状态

    记得use WinSvc; //------------------------------------- // 获取某个系统服务的当前状态 // // return status code if s ...

  9. (转)Linux C 多线程编程----互斥锁与条件变量

    转:http://blog.csdn.net/xing_hao/article/details/6626223 一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1. 初始化: 在 ...

  10. 假如Kafka集群中一个broker宕机无法恢复,应该如何处理?

    假如Kafka集群中一个broker宕机无法恢复, 应该如何处理? 今天面试时遇到这个问题, 网上资料说添加新的broker, 是不会自动同步旧数据的. 笨办法 环境介绍 三个broker的集群, z ...