一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了。

关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了。

当k==1时 显然的矩阵乘法 多开一个位置维护前缀和即可。当然也可以 公式法:\(f_1+f_2+...+f_n=f_{n+2}-1\)

证明其 只需要数学归纳法即可。

当k==2时 不难发现 要求出\((f_1+f_2+...f_n)+(f_2+...f_{n+1})+...(f_n+...f_{2n-1})\)

把这个东西 画成图 可以发现是一个平行四边形。

考虑对这个东西求和 我开始想了一个比较麻烦的方法容斥。

可以发现 如果我把整个矩阵都给求出来 只需要减掉不合法方案即可\(f_1\)被多加了n-1次 \(f_2\)被多加了n-2次。

对这种形式求和怎么做?于是 我又构造了一个矩阵 多开两个位置 一个表示普通前缀和 一个表示当前前缀和。

发现这样就能把答案算出来了。

以上和正解毫无关系 只不过是我考试的时候的想法。

以下是正解:

还是考虑k==3 发现刚才的面形成了体 不过类似于平行四边形体?但是在题目角度来说其实是正方体。

对这个东西求和 发现很难 刚才的容斥不能做了。

不过此时可以发现每一面 由上一面加上上一面得到。

转回头看k==2 发现每一条线可以有上面和上上面两条线得到。

此时 我们就可以发现一个非常特殊的条件 每个维度也是由上一个维度给推出来的。

此时我们对于每个维度单独做 然后利用上个维度做当前维度。

这样我们得到了一个klogn的做法。注意此时的矩阵为\(4\cdot 4\)的。

考虑优化。

可以发现求完一个维度之后 我们要求下一个维度。

这个过程还是一个重复的过程。

我们可以不手动调整 而是考虑构造一个矩阵帮我们进行调整。

这个矩阵也很容易构造。

剩下的就是先求出一个维度 然后利用维度生成维度是重复的。

矩阵快速幂来做即可。

总之 构造出来两个矩阵 可以发现 矩阵快速幂这两个矩阵的乘积即可。

非常巧妙。

  1. const int MAXN=110;
  2. int n,k,T,m;
  3. ll f[5],w[5];
  4. struct wy
  5. {
  6. ll a[5][5];
  7. wy(){memset(a,0,sizeof(a));}
  8. wy friend operator *(wy a,wy b)
  9. {
  10. wy c;
  11. rep(1,m,i)rep(1,m,j)rep(1,m,k)
  12. c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
  13. return c;
  14. }
  15. wy friend operator ^(wy a,int p)
  16. {
  17. wy c;
  18. rep(1,m,i)rep(1,m,j)c.a[i][j]=a.a[i][j];
  19. while(p)
  20. {
  21. if(p&1)c=c*a;
  22. a=a*a;p=p>>1;
  23. }
  24. return c;
  25. }
  26. }A,B,C;
  27. int main()
  28. {
  29. freopen("fib.in","r",stdin);
  30. freopen("fib.out","w",stdout);
  31. get(T);
  32. while(T--)
  33. {
  34. get(n);get(k);m=4;
  35. if(n==1){puts("1");continue;}
  36. A.a[1][1]=0;A.a[1][2]=1;A.a[1][3]=0;A.a[1][4]=1;
  37. A.a[2][1]=1;A.a[2][2]=1;A.a[2][3]=1;A.a[2][4]=1;
  38. A.a[3][1]=0;A.a[3][2]=0;A.a[3][3]=1;A.a[3][4]=0;
  39. A.a[4][1]=0;A.a[4][2]=0;A.a[4][3]=0;A.a[4][4]=1;
  40. B.a[3][1]=1;B.a[3][3]=1;B.a[4][2]=1;B.a[4][4]=1;
  41. A=A^(n-2);C=A;
  42. --k;
  43. if(k)
  44. {
  45. A=A*B;
  46. A=A^(k-1);
  47. A=A*C;
  48. }
  49. f[1]=0;f[2]=1;f[3]=0;f[4]=1;
  50. memset(w,0,sizeof(w));
  51. rep(1,m,i)rep(1,m,j)w[i]=(w[i]+f[j]*A.a[j][i])%mod;
  52. putl(w[m]);
  53. }
  54. return 0;
  55. }

4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造的更多相关文章

  1. P2461 [SDOI2008]递归数列 矩阵乘法+构造

    还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...

  2. 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法

    已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...

  3. k阶斐波那契数列fibonacci第n项求值

    已知K阶斐波那契数列定义为:f0 = 0,  f1 = 0, … , fk-2 = 0, fk-1 = 1;fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, … ...

  4. K阶斐波那契数列--------西工大NOJ习题.10

    K阶斐波那契数列--------西工大NOJ习题.10 原创不易,转载请说明出处!!! 科普:k阶斐波那契数列的0到n-1项需要有初始值. 其中,0到n-2项初始化为0,第n-1项初始化为1. 在这道 ...

  5. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  6. 【poj3070】矩阵乘法求斐波那契数列

    [题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...

  7. Luogu P1962 斐波那契数列(矩阵乘法模板)

    传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...

  8. 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列

    矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...

  9. [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

随机推荐

  1. elasticsearch集群配置 (Tobe Continue)

    elasticsearch集群配置 (Tobe Continue)   准备 首先需要在每个节点有可以正常启动的单节点elasticsearch   elasticsearch集群配置仅需要在elas ...

  2. 免费馅饼——移动dp

    免费馅饼 题目描述 SERKOI最新推出了一种叫做"免费馅饼"的游戏: 游戏在一个舞台上进行.舞台的宽度为 \(W\) 格,天幕的高度为 \(H\) 格,游戏者占一格. 开始时游戏 ...

  3. JavaScript图形实例:H分形

    H分形是由一个字母H演化出迷宫一样场景的分形图案,其构造过程是:取一个中心点(x,y),以此中心点绘制一条长为L的水平直线和两条长为H的竖直直线,构成一个字母“H”的形状:再以两条竖直直线的上下共4个 ...

  4. Mysql如何取当日的数据

    下面的sql语句可以取出当日的数据 SELECT * FROM table WHERE 时间字段 BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') AND ...

  5. 【UWP】利用EF Core操作SQLite

    在以往开发中,一定要在vs中安装SQLite for Universal App Platform以及一款wrapper,如SQLitePCL.现在有了EntitfyFramewrok Core,我们 ...

  6. 线下---复习day02

    目录 1 后续课程安排 2 作业讲解 3 python中的魔法方法 setattr,getattr,setitem,getitem演示 with 上下文管理器 eq 4 cookie,session, ...

  7. 一个简单的webAPI调用

    1.新建一个ASP.NET Web应用程序. 2.选择空模板,WebAPI. 3.在Models文件夹添加Product类. 4.添加空控制器ProductController. 5.ProductC ...

  8. 不会用Java Future,我怀疑你泡茶没我快, 又是超长图文!!

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  9. python 读取指定文件夹中的指定文件类型的文件名

    import numpy as np import os path = 'F:\\wenjian'#指定文件所在路径 filetype ='.csv'#指定文件类型 def get_filename( ...

  10. 数据可视化实例(十): 相关图(matplotlib,pandas)

    相关图 https://datawhalechina.github.io/pms50/#/chapter8/chapter8 导入所需要的库 import numpy as np # 导入numpy库 ...