Luogu-5004 专心OI-跳房子(矩阵快速幂)

题目链接

题解:

先考虑最朴素的dp

设\(f[i][0/1]\)表示第\(i\)个位置跳/不跳的方案数,则:

\[\begin{cases}
f[i][0]=f[i-1][0]+f[i-1][1]\\
\\
f[i][1]=f[i-m-1][0]+f[i-m-1][1]
\end{cases}
\]

发现可以将\(f[i][0]+f[i][1]\)记为\(g[i]\),上式化为

\[g[i]=g[i-1]+g[i-m-1]
\]

很明显可以用矩阵快速幂加速转移:

\(g[i]\)可以转移至下一次的\(g[i]\)

\(g[i-m]\)可以转移至下一次的\(g[i]\)

\(g[i]\)可以转移至下一次的\(g[i-1]\)

也就是说,构建一个这样的矩阵:

\[G=
\left[
\begin{matrix}
0&0&0&\cdots&1\\
1&0&0&\cdots&0\\
0&1&0&\cdots&0\\
0&0&1&\cdots&0\\
&&\vdots\\
0&0&0&\cdots&1\\
\end{matrix}
\right]
\]

初始矩阵\(S[0][0]=1\)

代码:

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<ctime>
  5. #include<queue>
  6. #include<stack>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<algorithm>
  10. #define qmax(x,y) (x=max(x,y))
  11. #define qmin(x,y) (x=min(x,y))
  12. #define mp(x,y) make_pair(x,y)
  13. using namespace std;
  14. typedef long long ll;
  15. typedef pair<int,int> pii;
  16. inline ll read(){
  17. ll ans=0,fh=1;
  18. char ch=getchar();
  19. while(ch<'0'||ch>'9'){
  20. if(ch=='-') fh=-1;
  21. ch=getchar();
  22. }
  23. while(ch>='0'&&ch<='9')
  24. ans=ans*10+ch-'0',ch=getchar();
  25. return ans*fh;
  26. }
  27. const int P=1e9+7;
  28. struct matrix{
  29. int a[20][20];
  30. }S,G,base,Tmp;
  31. int m;
  32. ll n;
  33. inline void build(){
  34. G.a[m][m]++,G.a[0][m]++;
  35. for(int i=1;i<=m;i++)
  36. G.a[i][i-1]++;
  37. }
  38. matrix operator * (matrix x,matrix y){
  39. for(int i=0;i<=m;i++)
  40. for(int j=0;j<=m;j++){
  41. Tmp.a[i][j]=0;
  42. for(int k=0;k<=m;k++)
  43. (Tmp.a[i][j]+=1ll*x.a[i][k]*y.a[k][j]%P)%=P;
  44. }
  45. return Tmp;
  46. }
  47. matrix poww(matrix x,ll y){
  48. for(int i=0;i<=m;i++)
  49. base.a[i][i]=1;
  50. while(y){
  51. if(y&1) base=base*x;
  52. x=x*x,y>>=1;
  53. }
  54. return base;
  55. }
  56. int main(){
  57. // freopen("nh.in","r",stdin);
  58. // freopen("zhy.out","w",stdout);
  59. n=read(),m=read();
  60. build(),G=poww(G,n+1);
  61. int Ans=0;
  62. for(int i=0;i<=m;i++)
  63. (Ans+=G.a[0][i])%=P;
  64. printf("%d\n",Ans);
  65. return 0;
  66. }

Luogu-5004 专心OI-跳房子(矩阵快速幂)的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  3. Luogu P3390 【模板】矩阵快速幂

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

  4. Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)

    补一补之前的坑 因为上次关于矩阵的那篇blog写的内容太多太宽泛了,所以这次把一些板子和基本思路理一理 先看这道模板题:P3390 [模板]矩阵快速幂 首先我们知道矩阵乘法满足结合律而不满足交换律的一 ...

  5. Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  6. 3990 [模板]矩阵快速幂 洛谷luogu

    题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...

  7. Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化

    大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...

  8. 洛谷【P5004 专心OI - 跳房子】 题解

    题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...

  9. 斐波那契数列第N项f(N)[矩阵快速幂]

    矩阵快速幂 定义矩阵A(m*n),B(p*q),A*B有意义当且仅当n=p.即A的列数等于B的行数. 且C=A*B,C(m*q). 例如: 进入正题,由于现在全国卷高考不考矩阵,也没多大了解.因为遇到 ...

随机推荐

  1. xcode 运行 lua版本崩溃 解决方案

    问题描述:运行到LuaStack::init() 崩溃 原因: luajit不支持arm64 解决方案:编译luajit64位静态库 a.可以直接下载别人编译好的库,然后直接覆盖cocos2d\ext ...

  2. iOS开发之CocoaAsyncSocket学习

    本文转载至 http://blog.csdn.net/l_ch_g/article/details/17050757 AsyncSocket AsyncSocket类是支持TCP的AsyncUdpSo ...

  3. Android去掉标题的方法

    我们写程序的时候经常要全屏显示或者不显示标题.比如我们做地图导航的时候就不要标题了,下面介绍三种方法来实现Android去掉标题. 第一种:也一般入门的时候经常使用的一种方法 在setContentV ...

  4. python 的时间复杂度

    Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”).该时 ...

  5. sql 存储过程,最简单的添加和修改

    数据库表结构  <1>新增数据,并且按照"name" 字段查询,如果重复返回“error”=-100 ,如果成功返回ID,如果失败ID=0 USE [数据库]GOSET ...

  6. mvn命令上传jar

    开发过程中涉及到下载第三SDK包,而本身项目是基于gradle的,所以为了项目中使用sdk包,需要将包加入到自己的仓库 1.利用nexus创建自己的第三方库thirdparty 类型hosted 2. ...

  7. JS给html控件赋值

    <html> <head> <title> JS给html控件赋值 </title> <script language="javascr ...

  8. Pandas 删除指定列中为NaN的行

    定位要删除的行 需求:删除指定列中NaN所在行. 如下图,’open‘ 列中有一行为NaN,定位到它,然后删除. 定位: df[np.isnan(df['open'])].index # 这样即可定位 ...

  9. 23种设计模式UML图

  10. mac截屏

    shift+command+3 : 截全屏 shift+command+4 : 出现十字架的坐标图标,画框截图