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的值是相同的.分块的时候要注意判断. 将每块的 ...
随机推荐
- C++模式学习------工厂模式
工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...
- NOIP赛前集训营-提高组(第一场)#A 中位数
题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l,r]表示,代表A[l], A[l + 1], ..., A[r]这段数.对于一 ...
- 最新wireshark抓包教程
http://jingyan.baidu.com/article/d71306350f213b13fdf475b9.html 大家都知道,sniffer是一款收费产品, 要真正的学会使用,因为有许多的 ...
- 【BZOJ1072】排列(搜索)
[BZOJ1072]排列(搜索) 题面 BZOJ 洛谷 题解 算下复杂度,如果用\(next\_permutation\) 那就是\(10!\times 10\times 15\),复杂度不太对 那好 ...
- 【XSY2307】树的难题
Description Solution 看到这种路径统计问题,一般就想到要用点分治去做. 对于每个重心\(u\),统计经过\(u\)的合法的路径之中的最大值. 第一类路径是从\(u\)出发的,直接逐 ...
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
- 【bzoj3570】 Cqoi2014—通配符匹配
http://www.lydsy.com/JudgeOnline/problem.php?id=3507 (题目链接) 题意 给出一个主串,里面有些通配符,'*'可以代替任意字符串或者消失,'?'可以 ...
- bzoj 3667 Rabin-Miller算法
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...
- BZOJ1053:反素数(数学)
题目链接 对于任意的正整数\(x\),记其约数的个数为\(g(x)\).现在定义反素数:对于\(0<i<x\),都有\(g(x)>g(i)\),那么就称x为反素数. 现在给定一个数N ...
- SSO基于cas的登录
概念介绍 1.定义 CAS ( CentralAuthentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法 ...