博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
矩阵快速幂
阅读量:5289 次
发布时间:2019-06-14

本文共 1483 字,大约阅读时间需要 4 分钟。

将线性递推式转化成矩阵乘法,再结合快速幂实现O(logn)

此法可广泛用于动态规划等递推题目

实现时仅需将*重载,其余同快速幂

#include
#include
using namespace std;#define ll long longconst ll p=1e9+7;ll n,k;struct Z{ ll a[105][105]; Z operator * (const Z &w) const //第一个const表示不改变w 第二个不改变a &表示不复制w { Z re; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) re.a[i][j]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) re.a[i][k]+=a[i][j]*w.a[j][k], re.a[i][k]=re.a[i][k]%p; return re; }};Z s,e;void Read(ll &x);void Write(ll x);Z power(Z w,ll kk){ Z re=e; while(kk>0) { if(kk&1) re=re*w; w=w*w; kk>>=1; } return re;}int main(){ Read(n),Read(k); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) Read(s.a[i][j]),e.a[i][j]=0; for(int i=1;i<=n;i++) e.a[i][i]=1; Z w=power(s,k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) Write(w.a[i][j]%p),putchar(' '); putchar('\n'); } return 0;}void Read(ll &x){ ll i=1; x=0; char c=getchar(); while(c<'0' or c>'9') { if(c=='-') i=-1; c=getchar(); } while(c>='0' and c<='9') { x=x*10+(c-'0'); c=getchar(); } x*=i;}void Write(ll x){ if(x<0) { putchar('-'); x=-1*x; } if(x>9) Write(x/10); putchar(x%10+'0');}

 

转载于:https://www.cnblogs.com/shzyk/p/9765692.html

你可能感兴趣的文章
HTTP状态码
查看>>
CentOS下Composer的安装和使用
查看>>
php面试题
查看>>
MySQL存储引擎InnoDB与Myisam的六大区别
查看>>
MySQL优化
查看>>
php经典算法面试题
查看>>
防止SQL注入
查看>>
Laravel 安全:避免 SQL 注入
查看>>
跨站请求CSRF攻击
查看>>
jsonp原理详解
查看>>
详解PHP如何实现单点登录
查看>>
集群间如何实现session共享
查看>>
秒杀场景案例分析
查看>>
cron表达式详解
查看>>
php中fastcgi和php-fpm是什么东西
查看>>
linux ps 命令参数详解
查看>>
ubuntu切换到root用户
查看>>
Ubuntu 无法进行SSH连接,开启22端口
查看>>
ubuntu server 14.04和18.04挂载vmware共享文件夹
查看>>
ubuntu-18.04 设置开机启动脚本
查看>>