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 输 ...
随机推荐
- bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...
- spark提交模式
spark基本的提交语句: ./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --depl ...
- myeclipse保存时弹出Building workspace
最近做项目,每次保存修改的东西.myeclipse都会building workspace(重新编译)一下.并且那 building的速度真不够慢的啊. 严重影响编程速度. 在网上也发现遇到此问题的很 ...
- 用python做的windows和linx文件夹同步。解决自动同步、加快传输大量小文件的速度、更丰富的文件上传过滤设置。
现在工具不好用,用的pycharm自动同步,但对于git拉下来的新文件不能自动上传到linux,只有自己编辑过或者手动ctrl + s的文件才会自动同步.导致为了不遗漏文件,经常需要全量上传,速度非常 ...
- VUE之使用百度地图API
利用vue创建点餐系统,在点餐系统中需要知道商家地址信息,这时就需要借用百度地图API. 步骤一:申请百度地图密钥: 步骤二:在index.html中添加百度地图JavaScript API接口: & ...
- 06_android虚拟机介绍
分辨率不用选太高,否则会占用太大内存.你选高分辨率一跑起来会干掉你的500多MB的内存.1/8内存就没了.百分之97%或者是98%的设备都是ARM CPU.ARM自己不生产CPU,它生产的是一个标准的 ...
- ASE分析
1.Prepare necessary input files(可以参考上次的博客http://www.cnblogs.com/renping/p/7391028.html) 1)对fq1和fq2合并 ...
- Linux系统挂载FAT32的U盘
1:将U盘插入USB接口,检查是否插好 2:用fdisk命令检查分区和USB设备信息 [root@yhwang ~]# fdisk -l Disk /dev/sda: 1000.2 GB, 10002 ...
- Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)
解决办法,json数据只能用双引号,而不能用单引号
- [亂數] <細說> C/C++ 亂數基本使用與常見問題
陸陸續續寫了 EA 一.二年,以前亂數引導文回頭看時才發現,怎麼有這麼多細節的錯誤.沒系統. 這篇文章主要引導初學者使用亂數,同時附上常被翻出來討論的議題,C/C++適用,唯以 C 語言撰之. 也由 ...