poj3233(矩阵快速幂的和)
题目链接:http://poj.org/problem?id=3233
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=;
const int maxn=+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
struct matrix
{
int a[maxn<<][maxn<<];
}ans,res,c;
int n,k,m;
int b[maxn<<][maxn<<];
void init()//这里全都是给矩阵赋值的过程
{
memset(ans.a,,sizeof(ans.a));
memset(res.a,,sizeof(res.a));
memset(c.a,,sizeof(c.a));
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
cin>>b[i][j];//输入的矩阵
}
for(int i=n;i<n*;i++)
{
for(int j=;j<n;j++)
{
c.a[i][j]=b[i-n][j];//代表第二个矩阵,也就是不变的那个
} }
for(int i=;i<n;i++)
{
res.a[i][i]=res.a[i][i+n]=;//单位矩阵的赋值
}
for(int i=n;i<n*;i++)
{
for(int j=n;j<n*;j++)
{
res.a[i][j]=b[i-n][j-n];//转移矩阵
}
}
for(int i=;i<n*;i++)
ans.a[i][i]=;//单位矩阵
}
matrix multiply(matrix x,matrix y)
{
matrix temp;
memset(temp.a,,sizeof(temp));
for(int i=;i<n*;i++)
{
for(int j=;j<n*;j++)
{
for(int l=;l<n*;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&)
ans=multiply(ans,res);
res=multiply(res,res);
k>>=;
}
}
void solve()//这就是最后两个矩阵相乘的过程了
{
ans=multiply(ans,c);
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
cout<<ans.a[i][j]<<" ";//最后只要输出左上角那个矩阵就好了
cout<<endl;
}
}
int main()
{
cin>>n>>k>>m;
init();
Quickpow();
solve();
return ;
}
poj3233(矩阵快速幂的和)的更多相关文章
- poj3233 Matrix Power Series(矩阵快速幂)
题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵 将 S 取幂,会发现一个特性: Sk +1右上角 ...
- POJ3233:Matrix Power Series(矩阵快速幂+二分)
http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...
- poj3233 题解 矩阵乘法 矩阵快速幂
题意:求S = A + A2 + A3 + … + Ak.(mod m) 这道题很明显可以用矩阵乘法,但是这道题的矩阵是分块矩阵, 分块矩阵概念如下:当一个矩阵A中的单位元素aij不是一个数值而是一个 ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU5950(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...
- 51nod 1126 矩阵快速幂 水
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
随机推荐
- 洛谷【P1104】生日(冒泡排序版)
题目传送门:https://www.luogu.org/problemnew/show/P1104 题目很简单,我主要是来讲冒泡排序的. 所谓冒泡排序,流程如下: 每次确定一个\(rk\)(从\(n\ ...
- linux 下查看某个进程中线程运行在哪个CPU上
运行程序,使用命令top查看指定的进程的PID: 然后使用命令: top -H -p PID 按f键,并使用上下切换,利用空格键选中nTH,P: 按esc键,P所在的列就是线程运行的CPU号:
- 时空上下文视觉跟踪(STC)算法
论文原文以及Matlab代码下载 算法概述 而STC跟踪算法基于贝叶斯框架,根据跟踪目标与周围区域形成的的时空关系,在图像低阶特征上(如图像灰度和位置)对目标与附近区域进行了统计关系建模.通过计算置信 ...
- AI-Info-Micron-Menu:Products
ylbtech-AI-Info-Micron-Menu:Products 我们制造业界最广泛的存储器和存储技术产品组合:DRAM,NAND,NOR和3D XPoint™存储器. 凭借紧密的行业合作伙伴 ...
- Spring 学习十四 Spring security安全
Spring security: 我用过的安全机制: oauth2, filter, secured方法保护 9.2 保护web请求: 9.2.1 代理Servlet过滤器: Delegat ...
- 【jQuery】jquery.metadata.js验证失效
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- mac tree 命令
mac下默认是没有 tree命令的,不过我们可以使用find命令模拟出tree命令的效果,如显示当前目录的 tree 的命令: find . -print | sed -e 's;[^/]*/;|__ ...
- k8s 基础 docker-ce 安装(注k8s 的安装需要用此版docker 否则会报错 )
yum install -y yum-utils yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/ ...
- redis持久化 发布消息与订阅
vi /usr/local/redis/etc/redis.conf 快照方式: save 900 1 save 300 10 save 60 10000 aof方式: ap ...
- hadoop自己写的最高温度程序源码
package com.teset; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...