题目链接:http://poj.org/problem?id=3233

Matrix Power Series
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 28105   Accepted: 11461

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

2 2 4
0 1
1 1

Sample Output

1 2

   2 3

思路:之前做的都是直接求矩阵的多少次方,这次做的是不仅仅要求多少次方,还要求它们的和,那么该怎么做呢?  刚开始想的是会不会是用一个for循环把1~k每一个都用一次矩阵快速幂,但是很快就否认了,这样肯定会超时,然后想了很久,发现其实是这样的:这题就是求一个矩阵的和式:S(k),直接对和式建立递推:

建立矩阵,注意此处S和A都是2*2的矩阵,E表示单位矩阵,O表示零矩阵(全是0,与其他矩阵相乘都为0),显然E,O都是2*2的

所以第一个样例是一个4*4的矩阵,

所以每次我们构造矩阵都是构造n*2的矩阵

具体看代码:

#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1000;
const int maxn=30+10;
const int maxk=5e3+10;
const int maxx=1e4+10;
const ll maxe=1000+10;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
struct matrix
{int a[maxn<<1][maxn<<1];
}ans,res,c;
int n,k,m;
int b[maxn<<1][maxn<<1];
void init()//这里全都是给矩阵赋值的过程
{memset(ans.a,0,sizeof(ans.a));memset(res.a,0,sizeof(res.a));memset(c.a,0,sizeof(c.a));for(int i=0;i<n;i++){for(int j=0;j<n;j++)cin>>b[i][j];//输入的矩阵
    }for(int i=n;i<n*2;i++){for(int j=0;j<n;j++){c.a[i][j]=b[i-n][j];//代表第二个矩阵,也就是不变的那个
        }}for(int i=0;i<n;i++){res.a[i][i]=res.a[i][i+n]=1;//单位矩阵的赋值
    }for(int i=n;i<n*2;i++){for(int j=n;j<n*2;j++){res.a[i][j]=b[i-n][j-n];//转移矩阵
        }}for(int i=0;i<n*2;i++)ans.a[i][i]=1;//单位矩阵
}
matrix multiply(matrix x,matrix y)
{matrix temp;memset(temp.a,0,sizeof(temp));for(int i=0;i<n*2;i++){for(int j=0;j<n*2;j++){for(int l=0;l<n*2;l++){temp.a[i][j]=(temp.a[i][j]+x.a[i][l]*y.a[l][j]%m)%m;}}}return temp;
}
void Quickpow()//这里每个矩阵快速幂都是一样的
{while(k){if(k&1)ans=multiply(ans,res);res=multiply(res,res);k>>=1;}
}
void solve()//这就是最后两个矩阵相乘的过程了
{ans=multiply(ans,c);for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<ans.a[i][j]<<" ";//最后只要输出左上角那个矩阵就好了cout<<endl;}
}
int main()
{cin>>n>>k>>m;init();Quickpow();solve();return 0;
}

转载于:https://www.cnblogs.com/caijiaming/p/9651048.html

poj3233(矩阵快速幂的和)相关推荐

  1. 快速幂、快速乘、矩阵快速幂

    文章目录 一 快速幂 模板 模板例题 二 快速乘 模板 三 矩阵快速幂 例题 模板题 应用题1 应用题2 一 快速幂 目的:当我们在求f(x) = a ^ x % mod时,f(x)的结果会呈指数型增 ...

  2. 数论(二)快速幂 (矩阵快速幂)等比数列求和 最大公因数和最小公倍数

    快速幂 1.快速幂用于快速计算a的b次方,时间复杂度是O(log2b) 2.用于a和b比较大小的情况,常用的快速幂是带模快速幂 3.分析一个例子: 3 15=?  15=(1111)2 3e1 * ...

  3. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  4. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  5. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  6. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

  7. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  8. I-Matrix Power Series POJ - 3233 矩阵快速幂+分治

    I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...

  9. H - Fibonacci POJ - 3070 (矩阵快速幂)

    H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...

最新文章

  1. 树莓派的Raspbian Stretch with desktop和Ubuntu Mate(废弃)
  2. BOM--location对象、history对象
  3. 两个tplink路由器有线桥接_tplink和腾达路由器有线桥接设置图解
  4. java英文拼写检查并自动纠正
  5. python字典内置方法_柳小白Python学习笔记 12 内置方法之字典方法
  6. 微软ASP.NET官方网站MVC教程实际操作中的部分问题
  7. PowerBuilder通过JDBC连接MySQL数据库
  8. 按键精灵开发传奇手游教程-现在比较火的美杜莎传奇为例
  9. MapGIS注记文字无损转入ArcGIS软件
  10. 【Oracle 11g学习路线】
  11. twitter验证_如何在Twitter上进行验证(或至少尝试一下)
  12. 老小白手机安装termux(换源)运行Python2
  13. 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
  14. Linux系统如何优化
  15. javaScript(正则,DOM)
  16. 【学习笔记】《卓有成效的管理者》 第二章 掌握自己的时间
  17. hp工作站 安装服务器系统,HP工作站操作系统安装说明.pdf
  18. 我的世界java服务器搭建_Linux搭建我的世界服务端
  19. 【小技巧】AI语音合成,文本音频互转经验分享
  20. 攻防世界逆向高手题的key

热门文章

  1. 网页设计-[CSS+DIV设计实例:超酷的竖排导航栏 ]
  2. Redis的中并发问题的解决方案小结
  3. 【报告分享】2022微信视频号生态发展研究报告.pdf(附下载链接)
  4. 《统计学习方法》代码全解析——第一部分统计学习方法概论
  5. 剑指offer 面试题03. 数组中重复的数字
  6. 全球首发!惯性导航导论(剑桥大学)第九部分
  7. 算法大赛十强战队解题方案大公开!【附PPT下载】
  8. oracle and和or的执行顺序,Oraclewhere语句中and,or,not的执行顺序
  9. 1-java学习笔记
  10. 吴恩达机器学习练习2:optimset和fminunc函数