POJ3233 Matrix Power Series
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
Source
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
#define RG register
int n,k,MOD;
int dui[],tail; struct juz{
LL s[][];
}a,c[],ini,mi[]; inline int getint()
{
RG int w=,q=; char c=getchar(); while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar(); while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline juz jia(juz p,juz q){
juz tmp;
for(RG int i=;i<=n;i++)
for(RG int j=;j<=n;j++)
tmp.s[i][j]=p.s[i][j]+q.s[i][j],tmp.s[i][j]%=MOD;
return tmp;
} inline juz cheng(juz p,juz q){
juz tmp;
for(RG int i=;i<=n;i++) for(RG int j=;j<=n;j++) tmp.s[i][j]=;
for(RG int i=;i<=n;i++)
for(RG int j=;j<=n;j++)
for(RG int l=;l<=n;l++)
tmp.s[i][j]+=p.s[i][l]*q.s[l][j],tmp.s[i][j]%=MOD;
return tmp;
} inline void work(){
n=getint(); k=getint(); MOD=getint();
for(RG int i=;i<=n;i++) for(RG int j=;j<=n;j++) ini.s[i][j]=getint();
while(k>) dui[++tail]=k,k>>=; mi[tail]=ini; c[tail]=ini;
for(RG int i=tail-;i>=;i--) {
mi[i]=cheng(mi[i+],mi[i+]);//每次平方
c[i]=jia(c[i+],cheng(c[i+],mi[i+]));//前面的乘以之前的部分再加上自己可降低复杂度
if(dui[i]&) mi[i]=cheng(mi[i],ini),c[i]=jia(c[i],mi[i]);
}
for(RG int i=;i<=n;i++) { for(RG int j=;j<=n;j++) printf("%lld ",c[].s[i][j]); printf("\n"); }
} int main()
{
work();
return ;
}
一个log:
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
#define RG register
int n,k,MOD;
int dui[],tail; struct juz{
LL s[][];
}a,c[],ini,mi[]; inline int getint()
{
RG int w=,q=; char c=getchar(); while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar(); while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline juz jia(juz p,juz q){
juz tmp;
for(RG int i=;i<=n;i++)
for(RG int j=;j<=n;j++)
tmp.s[i][j]=p.s[i][j]+q.s[i][j],tmp.s[i][j]%=MOD;
return tmp;
} inline juz cheng(juz p,juz q){
juz tmp;
for(RG int i=;i<=n;i++) for(RG int j=;j<=n;j++) tmp.s[i][j]=;
for(RG int i=;i<=n;i++)
for(RG int j=;j<=n;j++)
for(RG int l=;l<=n;l++)
tmp.s[i][j]+=p.s[i][l]*q.s[l][j],tmp.s[i][j]%=MOD;
return tmp;
} inline void work(){
n=getint(); k=getint(); MOD=getint();
for(RG int i=;i<=n;i++) for(RG int j=;j<=n;j++) ini.s[i][j]=getint();
while(k>) dui[++tail]=k,k>>=; mi[tail]=ini; c[tail]=ini;
for(RG int i=tail-;i>=;i--) {
mi[i]=cheng(mi[i+],mi[i+]);//每次平方
c[i]=jia(c[i+],cheng(c[i+],mi[i+]));//前面的乘以之前的部分再加上自己可降低复杂度
if(dui[i]&) mi[i]=cheng(mi[i],ini),c[i]=jia(c[i],mi[i]);
}
for(RG int i=;i<=n;i++) { for(RG int j=;j<=n;j++) printf("%lld ",c[].s[i][j]); printf("\n"); }
} int main()
{
work();
return ;
}
POJ3233 Matrix Power Series的更多相关文章
- [POJ3233]Matrix Power Series 分治+矩阵
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...
- POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 27277 Accepted: ...
- POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci
题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...
- POJ3233:Matrix Power Series(矩阵快速幂+二分)
http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...
- POJ3233 Matrix Power Series(矩阵快速幂+分治)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...
- POJ3233:Matrix Power Series(矩阵快速幂+递推式)
传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...
- POJ-3233 Matrix Power Series 矩阵A^1+A^2+A^3...求和转化
S(k)=A^1+A^2...+A^k. 保利求解就超时了,我们考虑一下当k为偶数的情况,A^1+A^2+A^3+A^4...+A^k,取其中前一半A^1+A^2...A^k/2,后一半提取公共矩阵A ...
- POJ3233 Matrix Power Series(快速幂求等比矩阵和)
题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...
- poj3233 Matrix Power Series(矩阵快速幂)
题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵 将 S 取幂,会发现一个特性: Sk +1右上角 ...
随机推荐
- Linux命令学习-top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up 1:22, ...
- 使用List的addAll()方法请判空指针
在写代码的时候经常会用到List,Set的addAll()方法,但是要注意addAll()方法不能传入空指针. package link.mengya.utils; import link.mengy ...
- Android 三种动画详解
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...
- (转载)java多态(2)-------Java转型(向上或向下转型)
5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”.再例如,麻雀是鸟类的一种(鸟类的子类), ...
- iOS数据本地持久化
p1:归档.Preference(NSUserDefault).沙盒存储 iOS开发中本地存储主要有三种形式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedAr ...
- MVC4 开篇
开篇,肯定不讲技术. 新项目开工了,用到了MVC4,赶快来园子吐槽下. 刚出来一年,学到了一些东西,但是自知比菜鸟还不如,空闲不看书,不练习demo,快吐我吧... 哈哈,吐吧,哥还是一样淡定,淡定, ...
- jQuery调用WCF服务传递JSON对象
下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...
- TDD(测试驱动开发)培训录(转)
本文转载自:http://www.cnblogs.com/whitewolf/p/4205761.html 最近也在了解TDD,发现这篇文章不错,特此转载一下. TDD(测试驱动开发)培训录 2015 ...
- C#基础——谈谈.NET异步编程的演变史
http://www.cnblogs.com/fzrain/p/3545810.html 前言 C#5.0最重要的改进,就是提供了更强大的异步编程.C#5.0仅增加两个新的关键字:async和awai ...
- Linux(9.14-9.20)学习笔记
实验一 Linux系统简介 一.Linux 为何物 Linux 就是一个操作系统,Linux 也就是系统调用和内核那两层. 二.Linux 历史简介 操作系统始于二十世纪 50 年代,当时的操作系统能 ...