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. 记录ajax前后交互

    前台请求 $.ajax({ url : '/turn', type : "post", data : { "userName":userName, " ...

  2. 在Feign中添加自定义配置

    首先先创建一个FeignConfig类,代码如下: package com.xing.config; import org.springframework.context.annotation.Bea ...

  3. leetcode-161周赛-5248-统计【优美子数组】

    题目描述: 自己的提交:超时: class Solution: def numberOfSubarrays(self, nums, k: int) -> int: dp = [0]* (len( ...

  4. 【转】SpringMVC整合websocket实现消息推送及触发

    1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name:    HandShake.java *Packag ...

  5. RVIZ可视化平台

  6. Vue源码------------- 数据响应系统的基本思路

    在 Vue 中,我们可以使用 $watch 观测一个字段,当字段的值发生变化的时候执行指定的观察者,如下: var vm = new Vue({ data: { num:1 } }) vm.$watc ...

  7. 网关协议:CGI和WSGI

    通常服务器程序分为web服务器和应用程序服务器.web服务器是用于处理HTML文件,让客户可以通过浏览器进行访问,主流的web服务器有Apache.IIS.Nginx.lighthttpd等.应用服务 ...

  8. NX二次开发-Block UI C++界面Face Collector(面收集器)控件的获取(持续补充 )

    Face Collector(面收集器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_initialize() ...

  9. [SCOI2009]迷路(矩阵快速幂) 题解

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  10. 18、Page Object 设计模式

    Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...