题目: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+...+A吗?

  于是我们构造出 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++的更多相关文章

  1. nyoj_299_Matrix Power Series_矩阵快速幂

    Matrix Power Series 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Given a n × n matrix A and a positive i ...

  2. Matrix Power Series POJ - 3233 矩阵幂次之和。

    矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ...

  3. POJ 2778 AC自己主动机+矩阵幂 不错的题

    http://poj.org/problem?id=2778 有空再又一次做下,对状态图的理解非常重要 题解: http://blog.csdn.net/morgan_xww/article/deta ...

  4. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  5. HDU 2157 矩阵幂orDP

    How many ways?? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. Java大数——快速矩阵幂

    Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...

  7. bzoj-4870-组合dp+矩阵幂

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 829  Solved: 446[Submit][Statu ...

  8. POJ-3744-概率dp+矩阵幂(分段)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10214   Accepted: 2980 Desc ...

  9. HDU - 6395 Sequence (分块+快速矩阵幂)

    给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...

随机推荐

  1. how install svn client on MacOS

    how install svn client on MacOS svn https://www.smartsvn.com/downloads/smartsvn/smartsvn-macosx-11_0 ...

  2. [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day 1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区. 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出 ...

  3. iphonex适配

    这一篇具体适配步骤比较全面 iphonex适配 这一篇图文讲解比较全面 关于H5页面在iPhoneX适配

  4. Linux下安装 mongodb

    1.下载 去官网 https://www.mongodb.com  找到对应版本的mongodb 的下载地址 这样的: https://fastdl.mongodb.org/linux/mongodb ...

  5. 概率图模型(PGM)综述-by MIT 林达华博士

    声明:本文转载自http://www.sigvc.org/bbs/thread-728-1-1.html,个人感觉是很好的PGM理论综述,高屋建瓴的总结了PGM的主要分支和发展趋势,特收藏于此. “概 ...

  6. kiki's game HDU - 2147(找规律)

    #include"stdio.h" int main( ) { int n,m; ||m!=)) { ==||m%==) printf("Wonderful!\n&quo ...

  7. BZOJ 3230 相似子串 | 后缀数组 二分 ST表

    BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...

  8. Miiler-Robin素数测试与Pollard-Rho大数分解法

    板题 Miiler-Robin素数测试 目前已知分解质因数以及检测质数确定性方法就只能\(sqrt{n}\)试除 但是我们可以基于大量测试的随机算法而有大把握说明一个数是质数 Miler-Robin素 ...

  9. 2017实习【Java研发】面经

    标签: 实习 面经 Java研发 阿里.腾讯.华为 找2017暑假实习,经历过被腾讯拒绝的无奈,也有拿到阿里和华为offer的喜悦,找实习过程也有一段时间了,在此把之前的面试知识点和经历做个小总结,以 ...

  10. 解题:USACO07FEB The Cow Lexicon

    题面 第一次做Trie上dp,感谢 @i207M 的资瓷 对子串们建立一棵Trie,设$dp[i][j]$表示到母串第$i$位为止在$Trie$上的$j$号节点时的最小修改数量,然后就可以枚举母串各位 ...