题意:求矩阵的次方和

解题思路:最容易想到方法就是两次二分因为 我们可以把一段  A^1 + A^2 + .......A^K   变成  A^1 + ..A^(K/2) +( A^1 + ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 + ..A^(K/2) +( A^1 + ..A^(K/2))*(A^(k/2)) + A^K 当K 为偶数的时候。

解题代码:

  1 // File Name: temp.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年09月17日 星期三 11时35分45秒
  4
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 using namespace std;
 26 int  n ,m , k ;
 27 int  ta,tb;
 28 struct Matrix
 29 {
 30    int   mat[30][30];
 31    void clear()
 32    {
 33       memset(mat,0,sizeof(mat));
 34    }
 35    void output()
 36    {
 37      for(int i =0  ;i < n ;i ++)
 38      {
 39        for(int j = 0 ;j < n ;j ++)
 40            printf("%d ",mat[i][j]);
 41      printf("\n");
 42      }
 43    }
 44    void init()
 45    {
 46       clear();
 47       for(int i = 0 ;i < n;i ++)
 48           for(int j = 0 ;j < n;j ++)
 49           {
 50             scanf("%d",&mat[i][j]);
 51           }
 52    }
 53    Matrix operator *(const Matrix &b) const
 54    {
 55        Matrix ret;
 56        ret.clear();
 57        for(int i = 0 ;i < n ;i ++)
 58            for(int j = 0;j < n;j ++)
 59            {
 60                for(int s = 0 ;s < n ;s ++)
 61                {
 62                  ret.mat[i][j] =(ret.mat[i][j] + mat[i][s] * b.mat[s][j]) % m ; // 第I 行  第J  列
 63                }
 64            }
 65        return ret;
 66    }
 67    Matrix operator *(const int  &b) const
 68    {
 69        Matrix ret;
 70        ret.clear();
 71        for(int i = 0 ;i < n ;i ++)
 72            for(int j = 0;j < n;j ++)
 73            {
 74                 ret.mat[i][j] = (mat[i][j] * b) % m ; // 第I 行  第J  列
 75            }
 76        return ret;
 77    }
 78    Matrix operator +(const Matrix &b) const
 79    {
 80        Matrix ret;
 81        ret.clear();
 82        for(int i = 0 ;i < n ;i ++)
 83            for(int j = 0;j < n;j ++)
 84            {
 85                 ret.mat[i][j] = (mat[i][j] + b.mat[i][j]) % m ; // 第I 行  第J  列
 86            }
 87        return ret;
 88    }
 89 };
 90 Matrix Pow( Matrix a ,LL t )
 91 {
 92   Matrix ret;
 93   ret.clear();
 94   for(int i = 0 ;i < n ;i ++)
 95        ret.mat[i][i] = 1;
 96   Matrix tmp = a;
 97   while(t)
 98   {
 99       if(t&1) ret = ret * tmp;
100       tmp = tmp * tmp;
101       t >>=1;
102   }
103   return ret;
104 }
105 Matrix add(Matrix a, int k )
106 {
107     Matrix ans;
108     ans.clear();
109     if(k == 1)
110     {
111       return a;
112     }
113     if(k&1)
114     {
115           Matrix temp = add(a,k/2);
116           ans = temp + temp * Pow(a,k/2) + Pow(a,k);
117     }else{
118           Matrix temp = add(a,k/2);
119           ans = temp + temp * Pow(a,k/2);
120     }
121     return ans ;
122 }
123 int main(){
124     LL l ;
125     while(scanf("%d %d %d",&n,&k,&m) != EOF)
126     {
127         Matrix  a;
128         a.clear();
129         a.init();
130         a = add(a,k);
131         //a.output();
132         a.output();
133     }
134     return 0;
135 }

View Code

写完以后过了竟然跑了 1300+ms  最快 0ms  不能忍上网查题解 发现了这种方法 :http://www.cnblogs.com/rainydays/archive/2011/02/21/1960189.html

他的主要思想是多加 n维度 构成一个能累加的矩阵 ,具体看博主题解。

这种思想很巧妙。

转载于:https://www.cnblogs.com/zyue/p/3979014.html

POJ 3233 Matrix Power Series 矩阵快速幂 + 二分相关推荐

  1. Matrix Power Series(矩阵快速幂,二分法/构造矩阵套矩阵)

    传送门 题意: 思路: 方法一:(二分) 分析: 奇偶分类讨论: 1.代码: #include <iostream> #include <cstdio> #include &l ...

  2. POJ 3233 Matrix Power Series (矩阵分块,递推)

    矩阵乘法是可以分块的,而且幂的和也是具有线性的. 不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1.然后矩阵快速幂就可以了. /*************************** ...

  3. poj 3233 Matrix Power Series

    Matrix Power Series 思路 题意比较简单,就是要求S(n)=∑i=1nAiS(n) = \sum _{i = 1} ^{n} A^ {i}S(n)=∑i=1n​Ai,显然有S(n)= ...

  4. poj 3233 Matrix Power Series

    最近一直在做矩阵的题目,这算是一道简单题目吧. 建立一个矩阵的结构体,便于赋值和返回值. S = A + A2 + A3 + - + Ak 如果 S=A+A2 + A3 +A4   S= (A + A ...

  5. POJ 3233 Matrix Power Serie (矩阵快速幂)

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

  6. poj 3323 Matrix Power Series (矩阵乘法 非递归形式)

    为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力 # ...

  7. POJ 3233 Matrix Power Serie

    题意:给一个n×n的矩阵A,求S = A + A2 + A3 + - + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...

  8. poj - problem 3070 Fibonacci 【矩阵 +快速幂】

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 9728 Descri ...

  9. poj3233(矩阵快速幂的和)

    题目链接:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K T ...

最新文章

  1. 细鹏系列裸金属服务器多核算力,鲲鹏凌云,开启多元计算新架构_外发版(40页)-原创力文档...
  2. python 加速循环的执行_python循环怎么用多线程去运行
  3. linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx
  4. PAT甲级1050 String Subtraction:[C++题解]字符串作差
  5. MFC中GetDlgItemInt()方法的疑惑与使用总结
  6. Git 教程学习--第三篇
  7. java读取同包文件_Java实现从jar包中读取指定文件的方法
  8. 人工智能-机器学习之seaborn(读取xlsx文件,小提琴图)
  9. WEB前端开发快速入门教程
  10. python识别车辆图片_opencv+python车辆识别
  11. C# .net实现发送手机短信功能
  12. 电子知识基础——电阻
  13. windows无法上网:代理服务器出现问题或地址有误
  14. 编译项目时报出已经定义了构造器
  15. 项目经理在团队不同阶段的领导风格
  16. 是面试官放水,还是公司太缺人?这都没挂,kotlin常用语法
  17. IcoFX v3.6.0 ICO图标制作工具中文便携版
  18. 如何解决Winfrom加载程序未能加载文件或程序集,抛出异常,
  19. 数商云SCM系统订单收货场景介绍,探索采购新模式,提升汽车服务企业运营水平
  20. 样本协差阵 matlab函数,方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...

热门文章

  1. 武汉数字工程研究所计算机软件分数,武汉数字工程研究所2017考研成绩查询时间:2月16日...
  2. C++ cin.sync()和cin.ignore()
  3. okex java sdk_OKEX官网新手使用教程
  4. python中matplotlib画图_Python-matplotlib画图(莫烦笔记)
  5. python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...
  6. LOAD DATA INFILE 语法
  7. java懒加载设计模式_java设计模式——单例模式
  8. asp获取mysql数据报错_ASP.NET在删除掉数据库文件后报错处理
  9. 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
  10. skywalking使用方法_skywalking 6.2配置相关和使用