题目描述

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

小 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. [Tensorflow]激励函数tf.nn.relu样例

    代码: import tensorflow as tf import numpy as np ### 定义添加神经网络层函数 START ### def add_layer(inputs,in_siz ...

  2. 使用UTF8字符集存储中文生僻字

    使用UTF8字符集存储中文生僻字 一.相关学习BLOG https://www.cnblogs.com/jyzhao/p/8654412.html http://blog.itpub.net/7818 ...

  3. 怎样理解构造函数中的return语句

    因为构造函数也是一个函数, 自然也可以有return语句, 不过和一般函数不太一样的是, 在构造函数中如果return的是一个对象, 则会直接返回这个对象, 如果return 的不是一个对象, 那在n ...

  4. mini.DataGrid使用说明

    mini.DataGrid表格.实现分页加载.自定义列.单元格渲染.行编辑器.锁定列.过滤行.汇总行等功能.Extend    mini.PanelUsage <div id="dat ...

  5. java注解日志记录到数据库

    1. pom添加依赖包 <!--添加aop依赖--><dependency> <groupId>org.springframework.boot</group ...

  6. Cryptography -- 密码学

    Introduction to Cryptography Cryptography enables you to store sensitive information or transmit it ...

  7. Android 主Module引用依赖Module,却无法使用里面的依赖库

    如果模块化开发中遇到 多模块的AndroidManifest.xml没有合并or多模块的资源文件没有合并or模块A include了模块B,而无法使用模块B内依赖的其他aar包中的类的时候or提示Su ...

  8. Java基础加强-反射机制

    反射的基石 -> Class 类(字节码)/*只要是在源程序中出现的类型,都要各自的Class实例对象,例如:int,int[],void*/如何得到各个字节码对应的实例对象(Class类型) ...

  9. python使得文件不包含重复行

    set函数去重 # -*- coding:utf-8 -*- srcTxt=open('1.txt','r').readlines() noRepeat=open('2.txt','w') st=se ...

  10. NUC970 Linux CAN 驱动问题及解决办法之一

    开发平台介绍: NUC970 + 内置CAN控制器(双通道CAN1\CAN2) + 官方Linux_Kernel(少量修改) 名词: 版本A,问题及修改涉及两个版本,其中最旧版本称为版本A 版本B,问 ...