POJ 3233 矩阵乘法
题意:求解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 矩阵乘法的更多相关文章
- poj 3233(矩阵高速幂)
题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...
- poj 3233 矩阵快速幂
地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方 结果模m的相加和是多少 Given a n × n matrix A and a positive i ...
- 矩阵儿快速幂 - POJ 3233 矩阵力量系列
不要管上面的标题的bug 那是幂的意思,不是力量... POJ 3233 Matrix Power Series 描述 Given a n × n matrix A and a positive in ...
- POJ 3213 矩阵乘法(优化)
思路: 1.暴力出奇迹 n=1000 n^3矩阵乘法竟然能卡过...(Tips:不要乱写读入优化,这玩意儿加了超时,不加AC--) 2. 注意题目中的"最多只能有一个地方不一样,," ...
- Matrix Power Series POJ - 3233 矩阵幂次之和。
矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ...
- poj 3233 矩阵快速幂+YY
题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角 ...
- POJ ---3070 (矩阵乘法求Fibonacci 数列)
Fibonacci Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...
- POJ 3233 (矩阵)
题意:对于矩阵A,求A^1 + ...... + A^k 按照矩阵十大经典题的思路大致做了下. 在k为奇数时: A^( k / 2+1)+ 1) * (A^1 + ....... A^(k/2)) ...
- POJ - 3233 矩阵套矩阵
题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...
随机推荐
- 8种方法提升windows 8使用方便-----Win+x 编辑菜单
在windows 8上,你可以同时按下windows键和x键或者右键点击屏幕左下角打开一个菜单名为电源菜单或者快速访问菜单,这个菜单包含快速访问系统的工具,如控制面板,命令提示符,任务管理器,资源管理 ...
- How does java technology relate to cloud computing?
Java Paas shootout (@IBM developer) Cloud computing is always a hot topic around IT field today.Ho ...
- Flex:在PANEL的title上加一个button[转]
//转自:http://www.cnblogs.com/GFantasy/archive/2010/03/05/1678917.htmlpackage{ import mx.containers.Pa ...
- bitmap缩放时抗锯齿
bitmap在进行放大缩小的时候经常会出现边缘锯齿的情况,通常的解决办法是在Paint中加入抗锯齿, paint.setAntiAlias(true); 但是有时候发现这并没有起到抗锯齿的作用,这是可 ...
- BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树
题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...
- GridView 服务端控件添加 js
针对服务端控件的 CommandField “Delete” 添加 js $("#GridView1").find("a").each( function() ...
- C#textbox右击弹出菜单
给窗口体拖一个contextMenuTrip 控件,也就是右键菜单控件,这时你就不要给这个控件写内容了, 选中textBox 然后点属性窗口,把它的contextMenuTrip 属性选中你刚才托的那 ...
- 项目中libevent几个问题
几个问题: .libevent到底用的是select还是iocp,然后是如何突破64限制的 typedef struct fd_set { u_int fd_count; /* how many ar ...
- hdu 1166 树状数组 线段树入门
点修改 区间求和 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- 帝国cms如何调用栏目别名作为分类标题?[!--classname--]标签不能用
用帝国cms建站安全性和生成速度会比dedecms好些,但ecms有个比较不方便的地方就是后台默认模板栏目那边没有一个seo标题设置的输入框,列表模板用的是[!--pagetitle--]标签,那么分 ...