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右上角 ...
随机推荐
- 使用Unity3D的50个技巧:Unity3D最佳实践
翻译故事 原文:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ 这篇技巧,我自己也在翻译, ...
- java 13-3 int类型的包装包Integer
1.Integer的概述 需求1:把100这个数据的二进制,八进制,十六进制计算出来 需求2:判断一个数据是否是int范围内的. 首先你得知道int的范围是多大? 为了对基本数据类型进行更多的操作, ...
- ajax技术的应用?
1,百度输入后的提示 2,新浪登录之后只刷新用户名
- 10301 MySQL各个版本区别及下载
参考:http://www.admin10000.com/document/62.html MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会 ...
- [iOS翻译]《iOS 7 Programming Cookbook》:iOS文件与文件夹管理(上)
简介: iOS基于OS X,而OSX本身基于Unix操作系统.在iOS里面,操作系统的完全路径结构是不可见的,因为每个APP的数据都存储自身的沙盒里面.沙盒环境实际上听起来像这样:一个只允许当前APP ...
- Linux常用指令---tail | head(查看文件)
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...
- Gradle tip #2: understanding syntax
In the Part 1 we talked about tasks and different stages of the build lifecycle. But after I publish ...
- Spring系列: 使用aop报错:nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$Refle
写了个最简单的aop例子 配置文件如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...
- linux内核分析 第八周
第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程 一.进程调度与切换 1.进程的调度时机与进程切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程 ...
- 千万不要在JS中使用连等赋值操作
前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最近一次出现了bug发现JS里的连等赋值操作的特色(坑). 网上搜索一番发现一个非常好的连等赋值的(来 ...