题目描述

穿越了森林,前方有一座独木桥,连接着过往和未来(连接着上一题和下一题...)。 这座桥无限长。

小 Q 在独木桥上彷徨了。他知道,他只剩下了 N 秒的时间,每一秒的时间里,他会向 左或向右移动一步。 N 秒之后,小 Q 恰在桥上某一特定位置,且他每两次经过此位置的时间间隔不会超过 M 秒。 那么问题来了,这 N 秒的时间里,小 Q 的路线总共会有多少种可能的形式。

输入

文件第一行两个正整数 N、M,如题目所描述

输出

输出一个整数,表示可能的路线数量最终模 1000000007 的结果

样例输入 1

4 2

样例输出 1

4

样例输入2

10 6

样例输出 2

184

数据规模与约定 对于 30% 的测试数据, 2 <=N<=100 ; 对于全部测试数据, 9 2 <=N <=10 , M <=N 且 M <=100 。保证 N 和 M 都是偶 数。资源限制 每个测试点空间限制 256MB,时间限制 1s。 一共 20 个测试点,满分 100 分。

思想:

    矩阵加速递推

若只考虑从最终到达的特定位置向单一方向出发,令 F(x, y)表示在一次出行内离开最终 位置 x 个单位时间时你恰好处于距最终位置 y 个单位距离的方案数。易得转移方程: F(1,1)=1,F(x,y)=F(x-1,y-1)+F(x-1,y+1). 预处理 F 数组,时间复杂度 O(M2 )。 由此可直接通过递推简便地得到答案,时间复杂度 O(NM),可通过 60%的测试数据。 利用矩阵乘法优化,可将时间复杂度优化至 O(M^3*log2N),通过全部测试数据。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define mod 1000000007
using namespace std; int n,m;
long long f[200][200];
struct node {
long long a[200][200]; }a,c; inline node MUL(node a,node b) {
node wfx;
memset(wfx.a,0,sizeof(c.a));
for(int i = 1;i <= m >> 1;i ++)
for(int j = 1;j <= m >> 1;j ++)
for(int k = 1;k <= m >> 1;k ++)
wfx.a[i][j] = (wfx.a[i][j] + a.a[i][k] * b.a[k][j]) % mod;
return wfx;
} inline void KSM(int y) {
for( ; y ; y >>= 1,a = MUL(a,a))
if(y & 1) c = MUL(c,a);
} int main()
{
#ifdef yilnr
#else
freopen("bridge.in","r",stdin);
freopen("bridge.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
f[1][1]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=(m>>1);j++)
{
f[i+1][j+1]=(f[i+1][j+1]+f[i][j])%mod;
f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mod;
}
for(int i=1;i<=(m>>1)-1;i++)a.a[i+1][i]=1;
for(int i=1;i<=(m>>1);i++)c.a[i][i] = 1,a.a[1][i]=(f[i<<1][0]<<1)%mod;
KSM(n>>1);
printf("%d",c.a[1][1]);
}

【csp模拟赛3】bridge.cpp--矩阵加速递推的更多相关文章

  1. luogu题解 P1707 【刷题比赛】矩阵加速递推

    题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...

  2. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  3. [HDU2294] Pendant - 矩阵加速递推

    Pendant Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. 矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

    https://www.vijos.org/p/1067 非常easy推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵.当中右上角 ...

  5. [模板][题解][Luogu1939]矩阵乘法加速递推(详解)

    题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...

  6. HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...

  7. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  8. POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

    题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #includ ...

  9. HDU 1757 矩阵快速幂加速递推

    题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...

随机推荐

  1. SAS学习笔记3 输入输出格式(format、informat函数)

    format函数:定义输出格式 informat函数:定义输入格式 proc format:定义输出格式 从外部读取文件 proc format过程步

  2. 涛哥:Qt安卓-5.12环境搭建

    简介 Qt for android 环境搭建,以Windows平台 Qt5.12为基准. 因为有不少人问相关问题,所以写篇文章汇总一下. 安装Qt 需要先安装Android版的Qt. 一般在Qt的安装 ...

  3. (四)springmvc之获取servlet原生对象

    一.使用DI注入的方式 <a href="<%=request.getContextPath()%>/servletObj_1">DI注入的方式</a ...

  4. 【小知识点】解决Chrome动画”卡顿”的办法

    为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);这两个属性都会开启GPU硬件 ...

  5. [LeetCode] 328. Odd Even Linked List ☆☆☆(奇偶节点分别放一起)

    每天一算:Odd Even Linked List 描述 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝 ...

  6. 【异常】ser class threw exception: java.sql.SQLException: The last packet successfully received from the server was 39,444 milliseconds ago. The last

    1 详细异常 ser class threw exception: java.sql.SQLException: The last packet successfully received from ...

  7. mybatis逆向工程(eclipse版本)

    1. 新建maven项目, 目录结构 2. src/main/resources中新建generatorConfig.xml <?xml version="1.0" enco ...

  8. Java学习第三天之注释

    编写程序时,总需要为程序添加一些注释,用以说明某段代码的作用,或者说明某个类的用途.某个方法的功能,以及该方法的参数和返回值的数据类型及意义等. 一.为什么要添加注释? (1)便于自己理解:有些人可能 ...

  9. 文本三剑客之grep及正则表达式

    1.grep 1. 什么是grep.egrep和fgrep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红).grep全称是Glo ...

  10. FreeRTOS编程风格

    数据类型 基本使用的是标准C里面的数据类型,但是针对不同的处理器,对标准C的数据类型又进行了重定义: 在FreeRTOS中详细的数据类型重定义在portmacro.h这个文件中,具体如下: /* Ty ...