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} ...
随机推荐
- c#之反射总结
1.了解什么事程序集 2.加载程序集 首先要加载需要加载的程序集,然后找到指定的类型,进而往下进行动态加载. 要加载的程序集中的内容: public class Class1:Person { pr ...
- Scrum10-22
Time:2013-10-22 Author:居玉皓 Things we have done since yesterday's meeting: 在今天的Scrum中,STORY1 开发前期准备工作 ...
- MVC与WebForm的一些区别
MVC与WebForm的一些区别 它们都是ASP.NET WEB开发的两种方式 .但是他们也是有一些不同.做个小结. 1.MVC是没有服务器端控件这么一说的,也就是没有viewstate,也就不会产生 ...
- Java 执行 SQL 脚本文件
转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...
- Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包
题目链接: 题目 E. The Values You Can Make time limit per test:2 seconds memory limit per test:256 megabyte ...
- 20160725noip模拟赛“Paodekuai” alexandrali
T1: 我们可以用火柴棒来表示十进制下的0~9, 如图所示 现给定火柴数n, 问用这n根火柴能组成的最小数和最大数分别是多少. 所有火柴必须全部用完, 并且所有数字必须是正的且不含前缀零. [解题] ...
- PhyreEngine3.8 MSAA resolution
There is something wrong in PhyreEngine 3.8 to fullfill MSAA, actually, I think it is eqaa You have ...
- HTTP长轮询和短轮询
http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...
- 8个月从CS菜鸟到拿到Google Offer的经历+内推
http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=77453&page=1&authorid=10377 ...
- POJ3176Cow Bowling
http://poj.org/problem?id=3176 题意:就是一个数塔的问题,属于最简单的动态规划题了吧,数塔从上到下只能找它下面的和它下面的右边的那一个想加,加到最后一行,看加哪个数可以保 ...