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
题意:给你一个矩阵A,且已知S = A + A^2 + A^3 +...+ A^k,求S
题解:假设有A + A^2 + A^3 +...+ A^n
那么如果n为偶数,该式子可以写为
(I+A^(N/2))*(A+A^2+...+A^(N/2))
如果n为奇数,则可以拆成一个矩阵A^n和n为偶数的另一串式子。
于是就可以分治了,1700ms莫名慌
学到了如何memset结构体里的数组,还是有收获的。
代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; struct matrix
{
int a[][];
matrix()
{
memset(a,,sizeof(a));
}
}; int n,k,m; void print(matrix &ans)
{
for(int i=; i<=n; i++)
{
for(int j=; j<=n-; j++)
{
printf("%d ",ans.a[i][j]);
}
printf("%d\n",ans.a[i][n]);
}
} matrix add(matrix a,matrix b)
{
matrix c;
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
c.a[i][j]=a.a[i][j]+b.a[i][j];
if(c.a[i][j]>=m)
{
c.a[i][j]%=m;
}
}
}
return c;
} matrix mul(matrix a,matrix b)
{
matrix c;
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
for(int k=; k<=n; k++)
{
c.a[i][j]+=a.a[i][k]*b.a[k][j];
if(c.a[i][j]>=m)
{
c.a[i][j]%=m;
}
}
}
}
return c;
} matrix kasumi(matrix a,int b)
{
matrix ans;
for(int i=; i<=n; i++)
{
ans.a[i][i]=;
}
if(b==)
{
return ans;
}
if(b==)
{
return a;
}
while(b)
{
if(b&)
{
ans=mul(ans,a);
}
a=mul(a,a);
b>>=;
}
return ans;
} matrix solve(matrix a,int k)
{
if(k==)
{
return a;
}
if(k&)
{
return add(solve(a,k-),kasumi(a,k));
}
else
{
return mul(add(kasumi(a,),kasumi(a,k>>)),solve(a,k>>));
}
} int main()
{
scanf("%d%d%d",&n,&k,&m);
matrix a,ans;
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
scanf("%d",&a.a[i][j]);
}
}
ans=solve(a,k);
print(ans);
}


POJ3233 Matrix Power Series(矩阵快速幂+分治)的更多相关文章

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

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

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

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

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

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

  4. POJ 3233:Matrix Power Series 矩阵快速幂 乘积

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

  5. POJ 3233 Matrix Power Series 矩阵快速幂

    设S[k] = A + A^2 +````+A^k. 设矩阵T = A[1] 0 E E 这里的E为n*n单位方阵,0为n*n方阵 令A[k] = A ^ k 矩阵B[k] = A[k+1] S[k] ...

  6. POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

    矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...

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

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

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

  9. POJ3233Matrix Power Series(矩阵快速幂)

    题意 题目链接 给出$n \times n$的矩阵$A$,求$\sum_{i = 1}^k A^i $,每个元素对$m$取模 Sol 考虑直接分治 当$k$为奇数时 $\sum_{i = 1}^k A ...

随机推荐

  1. 使用resteasy作为dubbox消费者

    dubbox服务提供者是REST风格的,消费者可能是从dubbox过来的,也可能是从第三方外部系统过来的.后者的话我们没得选,只能以服务提供者直连,服务治理平台和监控中心手再长,也管不到别人的地盘.但 ...

  2. CentOS 7 Update GCC G++

    curl https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2 -O echo "extracting files..." ...

  3. MySQL模式匹配(LIKE VS REGEXP)

    3.3.4.7. 模式匹配 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. SQL模式匹配允许你使用“_”匹配任何单个字符, ...

  4. 显示等待 之 text_to_be_present_in_element 判断元素是否有xx 文本信息 用法

  5. 单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code解释

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  6. Oracle数据库Where条件执行顺序

    由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHE ...

  7. C语言中字符数据的输入和输出

    字符的输出 C语言中使用putchar函数来输出字符数据 #include <stdio.h> int main() { char a,b,c,d; //定义字符变量a,b,c,d a = ...

  8. Python Twisted系列教程15:测试诗歌

    作者:dave@http://krondo.com/tested-poetry/  译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入门!“浏览 ...

  9. 1.3Broker

    Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人. 作为中间人,我们有几种方案可选择: 1.RabbitMQ R ...

  10. 【转】VS 安全开发生命周期(SDL)检查

    前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大 ...