Matrix Power Series
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 27277   Accepted: 11143

Description

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

  1. 2 2 4
  2. 0 1
  3. 1 1

Sample Output

  1. 1 2
  2. 2 3

Source

POJ Monthly--2007.06.03, Huang, Jinsong
 
题意: 这题就是求一个矩阵的和式:S(k),直接对和式建立递推:

A^i是一个矩阵

很显然,把每个A^i算出来是不行的,所以我们得找找关系

因为这里牵扯到了矩阵相加求和,所以我们可以想到构建一个包含A的矩阵(只要包含A和两个一就行,这样是为了最后能得到A^1+A^2+...+A^K的式子)

其中1是单位矩阵,单位矩阵是左对角线为1的矩阵

然后容易得到:

可以看出这个分块矩阵的左下角那块就可以得到要求的解S

我们取这一块,再减去一个单位矩阵1即可。

参考博客:https://www.cnblogs.com/pdev/p/4063669.html

  1. #include <map>
  2. #include <set>
  3. #include <stack>
  4. #include <cmath>
  5. #include <queue>
  6. #include <cstdio>
  7. #include <vector>
  8. #include <string>
  9. #include <cstring>
  10. #include <iostream>
  11. #include <algorithm>
  12. #define debug(a) cout << #a << " " << a << endl
  13. using namespace std;
  14. const int maxn = 110;
  15. const int mod = 2;
  16. typedef long long ll;
  17. struct matrix {
  18. ll a[maxn][maxn];
  19. };
  20. matrix base, ans;
  21. ll n, t, m;
  22. matrix multip( matrix x, matrix y ) {
  23. matrix tmp;
  24. for( ll i = 0; i < 2*n; i ++ ) {
  25. for( ll j = 0; j < 2*n; j ++ ) {
  26. tmp.a[i][j] = 0;
  27. for( ll k = 0; k < 2*n; k ++ ) {
  28. tmp.a[i][j] = ( tmp.a[i][j] + x.a[i][k] * y.a[k][j] ) % m;
  29. }
  30. }
  31. }
  32. return tmp;
  33. }
  34. void f( ll x ) {
  35. while( x ) {
  36. if( x&1 ) {
  37. ans = multip( ans, base );
  38. }
  39. base = multip( base, base );
  40. x /= 2;
  41. }
  42. }
  43. int main() {
  44. while( cin >> n >> t >> m ) {
  45. memset( ans.a, 0, sizeof(ans.a) );
  46. memset( base.a, 0, sizeof(base.a) );
  47. for( ll i = 0; i < n; i ++ ) {
  48. for( ll j = 0; j < n; j ++ ) {
  49. cin >> base.a[i][j];
  50. }
  51. }
  52. for( ll i = n; i < 2*n; i ++ ) { //两个单位矩阵
  53. base.a[i][i-n] = base.a[i][i] = 1;
  54. }
  55. //上面两个for循环是为了构建出新的包含A的矩阵
  56. for( ll i = 0; i < 2*n; i ++ ) {
  57. ans.a[i][i] = 1;
  58. }
  59. f(t+1); //由上面举的例子可以看出要求出n次方,得算n+1次
  60. for( ll i = n; i < 2*n; i ++ ) {
  61. for( ll j = 0; j < n; j ++ ) {
  62. if( i == j+n ) {
  63. ans.a[i][j] --;
  64. }
  65. if( j != n-1 ) {
  66. cout << ( ans.a[i][j] + m ) % m << " ";
  67. } else {
  68. cout << ( ans.a[i][j] + m ) % m << endl;
  69. }
  70. }
  71. }
  72. }
  73. return 0;
  74. }

  

POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵的更多相关文章

  1. POJ3233 Matrix Power Series(快速幂求等比矩阵和)

    题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...

  2. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

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

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

  4. POJ3233:Matrix Power Series(矩阵快速幂+二分)

    http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...

  5. poj3233 Matrix Power Series(矩阵快速幂)

    题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵    将 S 取幂,会发现一个特性: Sk +1右上角 ...

  6. POJ-3233 Matrix Power Series 矩阵A^1+A^2+A^3...求和转化

    S(k)=A^1+A^2...+A^k. 保利求解就超时了,我们考虑一下当k为偶数的情况,A^1+A^2+A^3+A^4...+A^k,取其中前一半A^1+A^2...A^k/2,后一半提取公共矩阵A ...

  7. POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci

    题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...

  8. poj3233—Matrix Power Series

    题目链接:http://poj.org/problem?id=3233 题目意思:给一个矩阵n*n的矩阵A和一个k,求一个式子 S = A + A2 + A3 + … + Ak. 这个需要用到等比数列 ...

  9. POJ3233:Matrix Power Series(矩阵快速幂+递推式)

    传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...

随机推荐

  1. Rust生命周期bound用于泛型的引用

    在实际编程中,可能会出现泛型引用这种情况,我们会编写如下的代码: struct Inner<'a, T> { data: &'a T, } 会产生编译错误: error[E0309 ...

  2. 现代c++与模板元编程

    最近在重温<c++程序设计新思维>这本经典著作,感慨颇多.由于成书较早,书中很多元编程的例子使用c++98实现的.而如今c++20即将带着concept,Ranges等新特性一同到来,不得 ...

  3. .c和.h文件的区别

    .h文件(头文件): 一般写一些函数声明.宏定义.结构体等内容. 其实就是将各个.c文件中重复的声明.宏定义.结构体,枚举变量等提取出来,放进一个新的文件中,便于其他.c文件共享这部分的代码,同时也方 ...

  4. 【译】尝试使用Nullable Reference Types

    随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的.这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Co ...

  5. 单机版ZooKeeper的安装教程

    之前一直没有时间去整理,现在抽出几分钟时间整理以下,有问题的在评论区留言即可. 前期准备JDK环境(ZK需要jdk进行编译,本文以jdk1.8.0_211为例).Linux系统(本文以Centos7为 ...

  6. (二十四)c#Winform自定义控件-单标题窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. C#串口类封装 SuperSerialPort

    C#串口类封装 SuperSerialPort 基于SerialPort类做了简单的封装方便调用 代码 /// <summary> /// SuperSerialPort /// < ...

  8. Django安装于基本介绍

    pycharm果然是最强大的python IDE,在创建Diango项目时如果没有则自动下载. 然而即使是这样,我在安装Django的时候还是比较曲折的. Django的安装方式有很多,但是因为网络问 ...

  9. MYSQL--表与表之间的关系、修改表的相关操作

    表与表之间的操作: 如果所有信息都在一张表中: 1.表的结构不清晰 2.浪费硬盘空间 3.表的扩展性变得极差(致命的缺点) 确立表与表之间的关系.一定要换位思考(必须在两者考虑清楚之后才能得出结论) ...

  10. Springboot源码分析之jar探秘

    摘要: 利用IDEA等工具打包会出现springboot-0.0.1-SNAPSHOT.jar,springboot-0.0.1-SNAPSHOT.jar.original,前面说过它们之间的关系了, ...