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

POJ Monthly--2007.06.03, Huang, Jinsong
 
 
正解:矩乘快速幂+二分
解题报告;
  今天考试T1。
  考场上面推了一个上午的式子,好不容易发现一个,而且是一个log的,结果太复杂了,没调出来。最后没办法了,临时yy了一个两个log的方法,好歹也过了。
  考虑只有两种可能,题目相当于是要求一个前缀和,那么矩乘满足分配律,所以我们可以直接利用前面的结果乘起来就可以了。 
  还是数学题做少了,不会推式子,还是要多练。
 
  当然还有一个log的方法,就是直接倒着做,其余的完全相同。
 
  两个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 ;
}

一个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的更多相关文章

  1. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

  2. POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 27277   Accepted:  ...

  3. POJ3233]Matrix Power Series && [HDU1588]Gauss Fibonacci

    题目:Matrix Power Series 传送门:http://poj.org/problem?id=3233 分析: 方法一:引用Matrix67大佬的矩阵十题:这道题两次二分,相当经典.首先我 ...

  4. POJ3233:Matrix Power Series(矩阵快速幂+二分)

    http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...

  5. POJ3233 Matrix Power Series(矩阵快速幂+分治)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...

  6. POJ3233:Matrix Power Series(矩阵快速幂+递推式)

    传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...

  7. 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 ...

  8. POJ3233 Matrix Power Series(快速幂求等比矩阵和)

    题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...

  9. poj3233 Matrix Power Series(矩阵快速幂)

    题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵    将 S 取幂,会发现一个特性: Sk +1右上角 ...

随机推荐

  1. Linux命令学习-top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up  1:22,   ...

  2. 使用List的addAll()方法请判空指针

    在写代码的时候经常会用到List,Set的addAll()方法,但是要注意addAll()方法不能传入空指针. package link.mengya.utils; import link.mengy ...

  3. Android 三种动画详解

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...

  4. (转载)java多态(2)-------Java转型(向上或向下转型)

    5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”.再例如,麻雀是鸟类的一种(鸟类的子类), ...

  5. iOS数据本地持久化

      p1:归档.Preference(NSUserDefault).沙盒存储 iOS开发中本地存储主要有三种形式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedAr ...

  6. MVC4 开篇

    开篇,肯定不讲技术. 新项目开工了,用到了MVC4,赶快来园子吐槽下. 刚出来一年,学到了一些东西,但是自知比菜鸟还不如,空闲不看书,不练习demo,快吐我吧... 哈哈,吐吧,哥还是一样淡定,淡定, ...

  7. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  8. TDD(测试驱动开发)培训录(转)

    本文转载自:http://www.cnblogs.com/whitewolf/p/4205761.html 最近也在了解TDD,发现这篇文章不错,特此转载一下. TDD(测试驱动开发)培训录 2015 ...

  9. C#基础——谈谈.NET异步编程的演变史

    http://www.cnblogs.com/fzrain/p/3545810.html 前言 C#5.0最重要的改进,就是提供了更强大的异步编程.C#5.0仅增加两个新的关键字:async和awai ...

  10. Linux(9.14-9.20)学习笔记

    实验一 Linux系统简介 一.Linux 为何物 Linux 就是一个操作系统,Linux 也就是系统调用和内核那两层. 二.Linux 历史简介 操作系统始于二十世纪 50 年代,当时的操作系统能 ...