逛了一圈。。。觉得这篇讲的比较清楚:传送门~

简要概括:

1、线性代数的知识,单位矩阵的利用;(如果不知道单位矩阵的,先去补习一下线代,做几题行列式就会了);

2、然后构造好矩阵以后,直接做M次乘积运算,然后利用一个[1, 0 , ... , 0 ]矩阵提取答案就好了,对,那个[1,0,..., 0 ] 就是获取答案的作用。

PS

以前的矩阵快速幂总是这样写的:先构造一个矩阵,然后跑一发矩阵快速幂,然后这个矩阵a乘以另一个矩阵b就会得出答案,而答案矩阵往往会包括前一个答案的值。所以自己就有点不知所措。【这里写自己的智障困惑。。】

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7.  
  8. struct asd{
  9. LL a[110][110];
  10. };
  11. int n;
  12.  
  13. asd mul(asd a, asd b)
  14. {
  15. asd ans;
  16. memset(ans.a,0,sizeof(ans.a));
  17. for(int k=0;k<=n;k++)
  18. for(int i=0;i<=n;i++)
  19. if(a.a[i][k])
  20. for(int j=0;j<=n;j++)
  21. ans.a[i][j]+=a.a[i][k]*b.a[k][j];
  22.  
  23. return ans;
  24. }
  25.  
  26. asd quickmul(int g,asd x)
  27. {
  28. asd ans;
  29. memset(ans.a,0,sizeof(ans.a));
  30. for(int i=0;i<=n;i++)
  31. ans.a[i][i]=1;
  32. while(g)
  33. {
  34. if(g&1) ans=mul(ans,x);
  35. x=mul(x,x);
  36. g>>=1;
  37. }
  38. return ans;
  39. }
  40.  
  41. asd init(int k)
  42. {
  43. asd tmp;
  44. memset(tmp.a,0,sizeof(tmp.a));
  45. for(int i=0;i<=n;++i)
  46. tmp.a[i][i]=1;
  47.  
  48. char x[5];
  49. int a,b;
  50. while(k--)
  51. {
  52. scanf("%s",x);
  53. if(x[0]=='g')
  54. {
  55. scanf("%d",&a);
  56. tmp.a[0][a]++;
  57. }
  58. else if(x[0]=='s')
  59. {
  60. scanf("%d%d",&a,&b);
  61. for(int i=0;i<=n;i++)
  62. swap(tmp.a[i][a],tmp.a[i][b]);
  63. }
  64. else
  65. {
  66. scanf("%d",&a);
  67. for(int i=0;i<=n;i++)
  68. tmp.a[i][a]=0;
  69. }
  70. }
  71. return tmp;
  72. }
  73.  
  74. int main()
  75. {
  76. int m,k;
  77. asd ans,tmp;
  78. while(~scanf("%d%d%d",&n,&m,&k))
  79. {
  80. if((!n)&&(!m)&&(!k))
  81. break;
  82. tmp=init(k);
  83. ans=quickmul(m,tmp);
  84. memset(tmp.a,0,sizeof(tmp.a));
  85. tmp.a[0][0]=1;
  86. ans=mul(tmp,ans);
  87. for(int i=1;i<=n;i++)
  88. {
  89. if(i!=1) printf(" ");
  90. printf("%lld",ans.a[0][i]);
  91. }
  92. puts("");
  93. }
  94. return 0;
  95. }

POJ3735【矩阵快速幂】的更多相关文章

  1. Training little cats(poj3735,矩阵快速幂)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10737   Accepted:  ...

  2. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  3. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  4. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  5. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  6. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

  7. 51nod 1126 矩阵快速幂 水

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

  8. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  9. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

随机推荐

  1. linux新建文件和文件夹命令

    1.touch命令 touch命令用来修改文件的访问时间.修改时间.如果没有指定时间,则将文件时间属性改为当前时间. 当指定文件不存在,touch命令变为创建该文件. 语法: touch [-acm] ...

  2. 用 ERD 盘解决 Win8 自己主动更新后不能启动的问题

    用 ERD 盘解决 Win8 自己主动更新后不能启动的问题 有安装了 Win8 x64 系统的台式机,在自己主动更新后无法启动了.在黑屏的情况下.没有反应了. 安全模式也无法进入系统. 几经周折,发现 ...

  3. 图像滤镜艺术---PS图层混合模式之明度模式

    本文将介绍PS图层混合模式中比較复杂 的"明度"模式的算法原理及代码实现内容. 说到PS的图层混合模式,计算公式都有,详细代码实现也能找到,可是,都没有完整介绍全部图层混合模式的代 ...

  4. 分享一个utils.js源码

    NEJ.define([ './global.js', '{platform}util.js' ],function(NEJ,_h,_p,_o,_f,_r){ /* * 查看数据是否指定类型 * @p ...

  5. 周期性计划(一个cron守护进程):

    周期性计划(一个cron守护进程): root@ubuntu:/etc# ps -ef | grep cron root 903 1 0 16:25 ? 00:00:00 /usr/sbin/cron ...

  6. MATLAB 2013b .m 文件关联

    使用绿色版的MATLAB无法自动关联.m文件,在网上查到的解决办法是,在MATLAB里运行如下命令: cwd=pwd; cd([matlabroot '\toolbox\matlab\winfun\p ...

  7. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  8. Windows程序设计(1)——Win32运行原理(三)

    进程控制 1 获得系统进程 2 终止当前进程 3 终止其他进程 4 进程控制 4.1 获得系统进程 使用toolhelp模块可以实现获取系统中当前运行当中的进程列表. 思路如下,使用CreateToo ...

  9. 在dw中 <!----> 和 /**/ 的区别?

    <!-- -->是HTML的注释标签,使用<和>是符合HTML标签语法规则的./* */是CSS和JS的注释标签.两种注释有各自的使用环境,并且不能相互替代.

  10. POj 3253 Fence Repair(修农场栅栏,锯木板)(小根堆 + 哈弗曼建树得最小权值思想 )

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 28359   Accepted: 9213 Des ...