题目: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. SCRIPT7002: XMLHttpRequest: 网络错误 0x2efe, 由于出现错误 00002efe 而导致此项操作无法完成

    google中带中文参数可能查询,但是在IE带中文参数不能查询:报如下错误 SCRIPT7002: XMLHttpRequest: 网络错误 0x2efe, 由于出现错误 00002efe 而导致此项 ...

  2. 2013成都网赛1010 hdu 4737 A Bit Fun

    题意:定义f(i, j) = ai|ai+1|ai+2| ... | aj (| 指或运算),求有多少对f(i,j)<m.1 <= n <= 100000, 1 <= m &l ...

  3. (很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

    如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.Selec ...

  4. 反射就是获取该类的.class文件里面的方法,属性

    反射就是获取该类的.class文件里面的方法,属性

  5. P3835 【模板】可持久化平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...

  6. Linux命令之ipcalc

    ipcalc命令是一个简单的ip地址计算器,可以完成简单的IP地址计算任务.参数: -b:由给定的IP地址和网络掩码计算出广播地址: -4:ipv4: -6:ipv6: -h:显示给定IP地址所对应的 ...

  7. Cobalt Strike 3.13的新功能

    Cobalt Strike 3.13现已推出.此版本添加了TCP Beacong,进程参数欺骗,并将Obfuscate和Sleep功能扩展到SMB和TCP Beacons. TCP Beacon Co ...

  8. C++运算符重载形式——成员函数or友元函数

    运算符重载是C++多态的重要实现手段之一.通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能. 运算符重载的我们需要坚持四项基本原则: (1)不可 ...

  9. Maven问题合集

    背景:总结maven使用过程中的相关问题,方便以后查询! 1 问题汇总 今天在导入github上下载的maven项目时候,出现了一堆错误,一时间不知道该如何下手. 根据错误提示,发现是一些依赖的jar ...

  10. IEEE 754浮点数表示标准

    二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比 ...