本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia

[POJ3233]Matrix Power Series 分治+矩阵

题目大意

A为n×n(n<=30)的矩阵,让你求

\(\sum\limits_{i=1}^{k}A^i\)

并将答案对取模p

输入格式:

有多组测试数据,其中第一行有3个正整数,为n,k(k<=\(10^9\)),p(p<=\(10^4\))

后面有n行,每行n个数。

输出格式:

输出最后答案的矩阵。

输入输出样例

input

2 2 4

0 1

1 1

output

1 2

2 3

解题分析

首先,这道题k有10^9,肯定不能O(n)推过去,但我们发现这个随着k递增ans是严格递增的,并且满足一定的规律,在这里我们想到了分治。

我们先取答案的一半,尝试怎么凑出这个答案

我们让 \(a=\sum\limits_{i=1}^{k\over2}A^i,b=A^{k\over2}\)

我们发现,

如果 $k\mod2==0 $ 则

\(\sum\limits_{i=1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+\sum\limits_{i={k\over2}+1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+(\sum\limits_{i=1}^{k\over2}A^i*A^{k\over2})=a+a*b\)

怎么理解呢,可以认为我们用\(A^{k\over2}\)将\(\sum\limits_{i=1}^{k\over2}A^i\)的指数补成\(\sum\limits_{i={k\over2}+1}^{k}A^i\)。

所以,我们可以很容易推出当k为奇数的情况,只要将最后一位补上就可以。

\(\sum\limits_{i=1}^{k}A^i=\sum\limits_{i=1}^{k\over2}A^i+(\sum\limits_{i=1}^{k\over2}A^i*A^{k\over2})+A^k=a+a*b+b^2*A\)

这样,就可以在\(O(log_2n)\)出解了。

矩阵乘法加法就不多说了。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 50+10 using namespace std;
int p,n,k;
struct matrix{
int n,m;
int data[MAXN][MAXN];
void read(int x,int y)
{
n=x,m=y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&data[i][j]);
}
void print()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",data[i][j]);
printf("\n");
}
}
matrix operator * (matrix b)
{
matrix ans;
memset(ans.data,0,sizeof(ans.data));
ans.n=n;ans.m=b.m;
for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++) for(int k=1;k<=m;k++)
ans.data[i][j]+=data[i][k]*b.data[k][j],ans.data[i][j]%=p;
return ans;
}
matrix operator + (matrix b)
{
matrix ans;
memset(ans.data,0,sizeof(ans.data));
ans.n=n;ans.m=m;
for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++)
ans.data[i][j]=(data[i][j]+b.data[i][j])%p;
return ans;
}
}a,b,c,z;
void halfsort(matrix x,int y)
{
if(y==1) {c=x;b=x;return ;}
else
{
halfsort(x,y/2);
if(y%2==0)
{
b=b+(b*c);
c=c*c;
}else
{
b=b+(b*c);
b=b+(x*c*c);
c=c*c;c=c*x;
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&k,&p)!=EOF)
{
a=z;b=z;c=z;
a.read(n,n);
halfsort(a,k);
b.print();
}
return 0;
}

[POJ3233]Matrix Power Series 分治+矩阵的更多相关文章

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

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

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

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

  3. POJ 3233 Matrix Power Series (矩阵乘法)

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

  4. POJ 3233 Matrix Power Series(矩阵快速幂)

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

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

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

  6. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

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

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

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

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

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

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

随机推荐

  1. [SharePoint][SharePoint Designer 入门经典]Chapter11 工作流基础

    1.SPS中可以创建的工作流的种类 2.SPD工作流基础 3.创建列表\库工作流 4.创建可重用的工作流 5.利用基于站点的工作流 6.SPD 工作流的限制和注意事项

  2. unix关于打包命令zip的使用

    unix zip命令的基本使用方法是: zip [參数] [打包后的文件名称] [打包的文件夹路径] linux zip命令參数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 - ...

  3. 利用ajax异步处理POST表单中的数据

    //防止页面进行跳转 $(document).ready(function(){   $("#submit").click(function(){    var str_data= ...

  4. Chisel Tutorial(一)——Chisel介绍

    Chisel是由伯克利大学公布的一种开源硬件构建语言,建立在Scala语言之上,是Scala特定领域语言的一个应用,具有高度參数化的生成器(highly parameterized generator ...

  5. GO语言UDP小笔记

    <pre style="margin-top: 0px; margin-bottom: 0px;"><span style=" color:#0000f ...

  6. UVA 11987 Almost Union-Find 并查集单点修改

                                     Almost Union-Find I hope you know the beautiful Union-Find structur ...

  7. 0x13 链表与邻接表

    这东西我还是有点会玩的啊.. 邻值查找这东西不就是维护个前驱后继嘛.. #include<cstdio> #include<iostream> #include<cstr ...

  8. 0x06 倍增

    这东西太玄学了我真是不太会... 对于这道例题,很容易看出最大值必然是最大减最小,次大减次小…… 常规的贪心思想,分的个数一样,总长度越大越好.其实我的第一想法是二分右端点..但是只有40,至今没有搞 ...

  9. mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储

    摘自:http://blog.fens.me/mahout-recommendation-api/ 测试程序:RecommenderTest.java 测试数据集:item.csv 1,101,5.0 ...

  10. Java-SpringCloud:目录

    ylbtech-Java-SpringCloud:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:htt ...