POJ3233_Matrix Power Series_矩阵幂_C++
题目:http://poj.org/problem?id=3233
这是今天考试的题目,结果没想出来写了个暴力30分,看完题解之后觉得自己是SB
首先暴力就是一个个乘然后相加,时间是O(kn3),极限数据要跑一个月才跑得出来
我们思考,求幂的话有快速幂(不会快速幂戳这里: http://www.cnblogs.com/hadilo/p/5719139.html ),那么矩阵一样也是可以的是不是
因为对于方阵A来说,(A2)2=A4
于是实数怎样做快速幂,矩阵就怎样做
while (m>)
{
if (m%) mult(b,a);
m/=;
mult(a,a);
}
手写一个 mult 函数,就用最普通的 n3 矩阵乘法
(矩阵的基本运算,通俗易懂 http://www.cnblogs.com/hadilo/p/5865541.html)
void mult(int x[N][N],int y[N][N])
{
int i,j,k;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
{
c[i][j]=;
for (k=;k<=n;k++) c[i][j]=(c[i][j]+x[i][k]*y[k][j])%mo;
}
for (i=;i<=n;i++)
for (j=;j<=n;j++) x[i][j]=c[i][j];
}
但题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂
那么我们可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵
我们将 S 取幂,会发现一个特性
Sk 右上角那一块不正是我们要求的 A+A2+...+Ak 吗?
于是我们构造出 S 矩阵,然后对它求矩阵快速幂即可,最后别忘了减去一个单位阵
时间降为O(n3log2k),从一个月到0.8秒的跨越
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; const int N=;
int c[N][N],a[N][N],b[N][N],n,mo;
void mult(int x[N][N],int y[N][N])
{
int i,j,k;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
{
c[i][j]=;
for (k=;k<=n;k++) c[i][j]=(c[i][j]+x[i][k]*y[k][j])%mo;
}
for (i=;i<=n;i++)
for (j=;j<=n;j++) x[i][j]=c[i][j];
}
int main()
{
int m,i,j;
scanf("%d%d%d",&n,&m,&mo);
for (i=;i<=n;i++)
{
for (j=;j<=n;j++) scanf("%d",&a[i][j]);
a[i][i+n]=a[i+n][i+n]=b[i][i]=b[i+n][i+n]=;
}
n*=;
m++;
while (m>)
{
if (m%) mult(b,a);
m/=;
mult(a,a);
}
n/=;
for (i=;i<=n;i++) b[i][i+n]--;
for (i=;i<=n;i++)
{
for (j=;j<n;j++) printf("%d ",b[i][j+n]);
printf("%d\n",b[i][j+n]);
}
return ;
}
版权所有,转载请联系作者,违者必究
QQ:740929894
POJ3233_Matrix Power Series_矩阵幂_C++的更多相关文章
- nyoj_299_Matrix Power Series_矩阵快速幂
Matrix Power Series 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Given a n × n matrix A and a positive i ...
- Matrix Power Series POJ - 3233 矩阵幂次之和。
矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ...
- POJ 2778 AC自己主动机+矩阵幂 不错的题
http://poj.org/problem?id=2778 有空再又一次做下,对状态图的理解非常重要 题解: http://blog.csdn.net/morgan_xww/article/deta ...
- CodeForces621E 快速矩阵幂优化dp
有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...
- HDU 2157 矩阵幂orDP
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- Java大数——快速矩阵幂
Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...
- bzoj-4870-组合dp+矩阵幂
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 829 Solved: 446[Submit][Statu ...
- POJ-3744-概率dp+矩阵幂(分段)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10214 Accepted: 2980 Desc ...
- HDU - 6395 Sequence (分块+快速矩阵幂)
给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...
随机推荐
- Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt
Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...
- cnblog博客CSS定制
一.页面定制CSS #home { margin: 0 auto; width: 80%;/*原始65*/ min-width: 980px;/*页面顶部的宽度*/ background-color: ...
- codeforces 1041 E.Vasya and Good Sequences(暴力?)
E. Vasya and Good Sequences time limit per test 2 seconds memory limit per test 256 megabytes input ...
- BZOJ5289 HNOI/AHOI2018排列(贪心+堆)
题面描述的相当绕,其实就是如果ai=j,重排后ai要在aj之后.同时每个ai有附属属性wi,要求最大化重排后的Σiwi. 容易发现这事实上构成一张图,即由j向i连边.由于每个点入度为1或0,该图是基环 ...
- Ubantu下配置Sublime Text3---python环境的搭建
因为学习机器学习算法的原因,买的参考书籍很多都是python语言进行开发的,因此也想着在Linux系统下配置python的环境.Sublime是一款非常流行的编辑器,可以添加很多小巧有用的插件,同时也 ...
- 【刷题】洛谷 P3872 [TJOI2010]电影迷
题目描述 小A是一个电影迷,他收集了上百部的电影,打算从中挑出若干部在假期看完.他根据自己的口味和网上的介绍,对每部电影X都打了一个分数vX,表示自己喜欢的程度.这个分数的范围在-1000至1000之 ...
- 【刷题】BZOJ 3669 [Noi2014]魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- Genaro Network —— 区块链3.0缔造者
在2018年1月26日硅谷密探在美国旧金山艺术宫成功举办了“Blockchain Connect Conference”.在大会上,Genaro Network 联合CEO Jason Inch 携同 ...
- 【linux之文件查看,操作,权限管理】
一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...
- C++运算符重载形式——成员函数or友元函数
运算符重载是C++多态的重要实现手段之一.通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能. 运算符重载的我们需要坚持四项基本原则: (1)不可 ...