【JZOJ3294】【BZOJ4417】【luoguP3990】超级跳马
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】超级跳马的更多相关文章
- BZOJ4417: [Shoi2013]超级跳马
Description 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可 ...
- [BZOJ 4417][Shoi2013]超级跳马
4417: [Shoi2013]超级跳马 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 379 Solved: 230[Submit][Status ...
- 洛谷 P3990 [SHOI2013]超级跳马 解题报告
P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- 【BZOJ4417】: [Shoi2013]超级跳马
题目链接: 传送. 题解: 矩阵快速幂优化DP. 先考虑$nm^2$DP,设$f_{(i,j)}$表示从$1,1$到$i,j$的方案,显然这个方程和奇偶性有关,我们考虑某列的$i$同奇偶性的转移和奇偶 ...
- 【bzoj4417】[Shoi2013]超级跳马 矩阵乘法
题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法. ...
- [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马
Description 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可 ...
- Luogu P3990 [SHOI2013]超级跳马
这道题还是一道比较不可做的矩阵题 首先我们先YY一个递推的算法:令f[i][j]表示走到第i行第j列时的方案数,那么有以下转移: f[i][j]=f[i-1][j-2*k+1]+f[i+1][j-2* ...
- P3990 [SHOI2013]超级跳马
传送门 首先不难设\(f[i][j]\)表示跳到\((i,j)\)的方案数,那么不难得到如下转移 \[f[i][j]=\sum\limits_{k=1}^{\frac n2}f[i-2k+1][j-1 ...
随机推荐
- OK。第一个shell script 脚本
很简单吧.也很容易理解.读取两个字符放到变量firstname和lastname中,然后输出 编辑日期格式 上面是编辑日期格式.下面的例题是按照日期格式来分类创建文件
- Web.xml配置详解之context-param(转)
转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: <context-param> <para ...
- model字段对象和forms字段对象的区别和联系
一.model字段对象 (一)_meta _meta是django.db.models.options.Options的实例,获取字段对象可通过模型类来进行获取,而_meta可提供如下功能: 获取模型 ...
- 历史上最详细的SpringCloud搭建微服务的过程。(包括注册中心,服务提供者和服务消费者)
首先搭建注册中心,创建一个springboot的maven工程. 工程创建完成之后,先在资源文件中的application.properties中写配置文件. server.port= spring. ...
- python读取ini配置文件的示例代码(仅供参考)
这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 pip install configp ...
- HDU-4825 Xor Sum(字典树求异或最大值)
题目链接:点此 我的github地址:点此 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整 ...
- Django+telnetlib实现webtelnet
说明 基于 python3.7 + django 2.2.3 实现的 django-webtelnet.有兴趣的同学可以在此基础上稍作修改集成到自己的堡垒机中. 项目地址:https://github ...
- 屏幕左侧鼠标常驻,隐藏部分显示,文章鼠标常驻,隐藏部分隐藏(我的hexo next博客)
文章目录 如图 功能 代码 博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu?tab=repositories 如图 功能 最左侧添加透明 ...
- PE代码段中的数据
PE代码段中可能包含一些数据,比如 optional header中的data directory会索引到一些数据,比如import/export table等等: 还有一些jump table/sw ...
- 机器学习技法笔记:Homework #6 AdaBoost&Kernel Ridge Regression相关习题
原文地址:http://www.jianshu.com/p/9bf9e2add795 AdaBoost 问题描述 程序实现 # coding:utf-8 import math import nump ...