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
题意:给你一个矩阵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(矩阵快速幂+分治)的更多相关文章
- 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 矩阵快速幂 矩阵中的矩阵
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 27277 Accepted: ...
- 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 矩阵快速幂 乘积
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 18450 Accepted: ...
- 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] ...
- POJ 3233 Matrix Power Series 矩阵快速幂+二分求和
矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...
- POJ3233 Matrix Power Series(快速幂求等比矩阵和)
题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...
- 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 ...
- POJ3233Matrix Power Series(矩阵快速幂)
题意 题目链接 给出$n \times n$的矩阵$A$,求$\sum_{i = 1}^k A^i $,每个元素对$m$取模 Sol 考虑直接分治 当$k$为奇数时 $\sum_{i = 1}^k A ...
随机推荐
- 使用resteasy作为dubbox消费者
dubbox服务提供者是REST风格的,消费者可能是从dubbox过来的,也可能是从第三方外部系统过来的.后者的话我们没得选,只能以服务提供者直连,服务治理平台和监控中心手再长,也管不到别人的地盘.但 ...
- 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..." ...
- MySQL模式匹配(LIKE VS REGEXP)
3.3.4.7. 模式匹配 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. SQL模式匹配允许你使用“_”匹配任何单个字符, ...
- 显示等待 之 text_to_be_present_in_element 判断元素是否有xx 文本信息 用法
- 单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code解释
从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...
- Oracle数据库Where条件执行顺序
由于SQL优化起来比较复杂,并且还会受环境限制,在开发过程中,写SQL必须必须要遵循以下几点的原则: 1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHE ...
- C语言中字符数据的输入和输出
字符的输出 C语言中使用putchar函数来输出字符数据 #include <stdio.h> int main() { char a,b,c,d; //定义字符变量a,b,c,d a = ...
- Python Twisted系列教程15:测试诗歌
作者:dave@http://krondo.com/tested-poetry/ 译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入门!“浏览 ...
- 1.3Broker
Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人. 作为中间人,我们有几种方案可选择: 1.RabbitMQ R ...
- 【转】VS 安全开发生命周期(SDL)检查
前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大 ...