题意:求解A+A^2+...+A^k

题解:

1)利用通和公式,原式=(A^k+1 - A)(A - O)^-1 时间复杂度O(n^3lgk)

2)递归求解,A+A^2+...+A^k=(A+A^2+...+A^k/2)+A^k/2(A+A^2+...+A^k/2) 时间复杂度O(n^3lgk^2)

逆矩阵貌似繁琐,直接用第二种方法写的

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x)) using namespace std; int n,MOD,k; struct Matrix{
int n,m;
vector< vector<int> >a;
Matrix(){};
Matrix(const Matrix & T) : n(T.n),m(T.m)
{
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
a[i][j]=T.a[i][j];
}
}
Matrix(int N, int M)
{
n=N;
m=M;
a.resize(N);
for(int i=; i<N; i++)
a[i].resize(M);
}
Matrix & operator=(const Matrix &T)
{
n=T.n;
m=T.m;
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
a[i][j]=T.a[i][j];
}
return *this;
}
Matrix operator+(const Matrix &T) const
{
Matrix tmp(n,m);
for(int i=; i<n; i++)
for(int j=; j<m; j++)
tmp.a[i][j]=(a[i][j]+T.a[i][j])%MOD;
return tmp;
}
Matrix operator*(const Matrix &T) const
{
Matrix tmp(n,T.m);
for(int i=; i<n; i++)
for(int j=; j<T.m; j++)
for(int k=; k<m; k++)
tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*T.a[k][j])%MOD;
return tmp;
}
void input(int N, int M)
{
n=N;
m=M;
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
scanf("%d",&a[i][j]);
}
}
void output()
{
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
Matrix pow_m(int N)//矩阵满足n=m 矩阵快速幂
{
Matrix ret(n,n),tmp(*this);
for(int i=; i<n; i++)
ret.a[i][i]=;
while(N)
{
if(N&) ret=ret*tmp;
tmp=tmp*tmp;
N>>=;
}
return ret;
}
}ans,A; void work(int k)
{
if(k==)
{
ans=A;
return;
}
if(k==)
{
ans=A.pow_m();
return;
}
work(k/);
ans=ans*(A.pow_m()+A.pow_m(k/));
if(k&) ans=ans+A.pow_m(k);
} int main()
{
scanf("%d%d%d",&n,&k,&MOD);
A.input(n,n);
work(k);
ans.output();
return ;
}

太刁了

看到这种解法。

|A O|^k+1 =|A^k+1    O|

|E E|    |A^k+...+A^0 E|

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x)) using namespace std; int n,MOD,k; struct Matrix{
int n,m;
vector< vector<int> >a;
Matrix(){};
Matrix(const Matrix & T) : n(T.n),m(T.m)
{
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
a[i][j]=T.a[i][j];
}
}
Matrix(int N, int M)
{
n=N;
m=M;
a.resize(N);
for(int i=; i<N; i++)
a[i].resize(M);
}
Matrix & operator=(const Matrix &T)
{
n=T.n;
m=T.m;
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
a[i][j]=T.a[i][j];
}
return *this;
}
Matrix operator+(const Matrix &T) const
{
Matrix tmp(n,m);
for(int i=; i<n; i++)
for(int j=; j<m; j++)
tmp.a[i][j]=(a[i][j]+T.a[i][j])%MOD;
return tmp;
}
Matrix operator*(const Matrix &T) const
{
Matrix tmp(n,T.m);
for(int i=; i<n; i++)
for(int j=; j<T.m; j++)
for(int k=; k<m; k++)
tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*T.a[k][j])%MOD;
return tmp;
}
void input(int N, int M)
{
n=N;
m=M;
a.resize(n);
for(int i=; i<n; i++)
{
a[i].resize(m);
for(int j=; j<m; j++)
scanf("%d",&a[i][j]);
}
}
void output()
{
for(int i=; i<n; i++)
for(int j=; j<m; j++)
if(j<m-)
printf("%d ",a[i][j]);
else
printf("%d\n",a[i][j]);
}
Matrix pow_m(int N)//矩阵满足n=m 矩阵快速幂
{
Matrix ret(n,n),tmp(*this);
for(int i=; i<n; i++)
ret.a[i][i]=;
while(N)
{
if(N&) ret=ret*tmp;
tmp=tmp*tmp;
N>>=;
}
return ret;
}
}; int main()
{
scanf("%d%d%d",&n,&k,&MOD);
Matrix A(*n,*n);
for(int i=; i<n; i++)
for(int j=; j<n; j++)
scanf("%d",&A.a[i][j]); for(int i=; i<*n; i++)
A.a[n+i%n][i]=;
A=A.pow_m(k+); for(int i=; i<n; i++)
for(int j=; j<n; j++)
{
if(i==j) A.a[n+i][j]=(A.a[n+i][j]+MOD-)%MOD;
if(j<n-)
printf("%d ",A.a[n+i][j]);
else
printf("%d\n",A.a[n+i][j]);
}
return ;
}

POJ 3233 矩阵乘法的更多相关文章

  1. poj 3233(矩阵高速幂)

    题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...

  2. poj 3233 矩阵快速幂

    地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方  结果模m的相加和是多少 Given a n × n matrix A and a positive i ...

  3. 矩阵儿快速幂 - POJ 3233 矩阵力量系列

    不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ...

  4. POJ 3213 矩阵乘法(优化)

    思路: 1.暴力出奇迹 n=1000 n^3矩阵乘法竟然能卡过...(Tips:不要乱写读入优化,这玩意儿加了超时,不加AC--) 2. 注意题目中的"最多只能有一个地方不一样,," ...

  5. Matrix Power Series POJ - 3233 矩阵幂次之和。

    矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ...

  6. poj 3233 矩阵快速幂+YY

    题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角 ...

  7. POJ ---3070 (矩阵乘法求Fibonacci 数列)

    Fibonacci   Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2  ...

  8. POJ 3233 (矩阵)

    题意:对于矩阵A,求A^1 + ...... + A^k 按照矩阵十大经典题的思路大致做了下. 在k为奇数时:  A^( k / 2+1)+ 1) * (A^1 + ....... A^(k/2)) ...

  9. POJ - 3233 矩阵套矩阵

    题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...

随机推荐

  1. Careercup - Google面试题 - 4807591515389952

    2014-05-06 00:45 题目链接 原题: What would happen if you have only one server for a web cache (a web brows ...

  2. Visual Studio Code asp.net 5环境搭建技能Get

    启动准备阶段 预热 1 VS Code 官方地址:https://www.visualstudio.com/en-us/products/code-vs.aspx 2 安装Node.js :https ...

  3. bug集合

    解决方法:vertical-align:top;  垂直对齐方式:对浮动元素无效浮动类: ie 6 7要在一行显示多个div要 给每一个元素浮动 否则会出间隙. ie6双倍边距bug 1. bug条件 ...

  4. javascript积累

    本来是java程序员,但是工作过程中总是遇到各种js的任务得完成,所以也得慢慢积累啊! 一.浏览器对象模型(Browser Object Model)BOM     window对象:当前浏览器窗口 ...

  5. WCF 基础

    ServiceModel 配置元素 Binding 配置元素: 客户端Web.config: <?xml version="1.0" encoding="utf-8 ...

  6. boost序列化

    #include <iostream> #include <boost/serialization/serialization.hpp> #include <boost/ ...

  7. **json_encode:让Json更懂中文(JSON_UNESCAPED_UNICODE)

    我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量. 代码如下: <?php echo ...

  8. nohup 程序名 & (使程序推到后台运行,即使终端关闭,该程序依然运行)

    IshallbeThatIshallbe:~ iamthat$ ps -ef |grep ping 502 450 1 0 9:30PM ?? 0:00.05 ping www.baidu.com 5 ...

  9. C 语言学习guideline

    Kernighan和Ritchie的<The C Programming Language>(中译名<C程序设计语言>)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标 ...

  10. Mysql 分页语句Limit用法

    转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...