[P3390][模板] 矩阵快速幂
时间:2019-09-12
本文章向大家介绍[P3390][模板] 矩阵快速幂,主要包括[P3390][模板] 矩阵快速幂使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:给定n*n的矩阵A,求A^k
解法:矩阵快速幂;
1.矩阵快速幂;假设有 A和 B两个矩阵,当矩阵A的列数等于矩阵B的行数时,A与B可以相乘得到矩阵 C:
(1) 矩阵 C的行数等于矩阵 A的行数,C的列数等于 B的列数;
(2) 乘积 C的第 行第 列的元素等于矩阵 A的第 行的元素与矩阵 B的第 列对应元素乘积之和。
明白了这些原理之后,就可以利用快速幂的原理对矩阵进行运算了;
附上代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define rg register using namespace std; const int mod = 1e9+7; ll n,k; ll a[101][101],b[101][101]; ll ans[101][101]; inline void matrix(){ memcpy(b,ans,sizeof(ans)); memset(ans,0,sizeof(ans)); for(rg int k=1;k<=n;++k) for(rg int i=1;i<=n;++i) for(rg int j=1;j<=n;++j) { ans[i][j]=(ans[i][j]+(b[i][k]*a[k][j])%mod)%mod; } } inline void matrix_(){ memset(b,0,sizeof(b)); for(rg int k=1;k<=n;++k) for(rg int i=1;i<=n;++i) for(rg int j=1;j<=n;++j){ b[i][j]=(b[i][j]+(a[i][k]*a[k][j])%mod)%mod; } memcpy(a,b,sizeof(b)); } inline void matrix_ksm(ll bas){ while(bas){ if(bas&1) matrix(); matrix_(); bas>>=1; } } int main() { scanf("%lld%lld",&n,&k); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ scanf("%d",&a[i][j]); if(i==j) ans[i][j]=1; } matrix_ksm(k); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j) printf("%lld ",ans[i][j]); cout<<endl; } return 0; }
原文地址:https://www.cnblogs.com/nnezgy/p/11512877.html
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide图片缓存库的联系与区别
- React Native之StyleSheet样式表
- 高仿ios斗鱼界面
- 浅谈前端JavaScript编程风格
- Android仿京东、天猫商品详情页
- 中介者模式
- 访问者模式
- ExpandableListView实现商品列表折叠
- Linux基础(day1)
- react-native 之布局总结
- 『教程』熊晨沣蓝牙实战--小程序蓝牙连接2.0
- react native实现上拉加载下拉刷新
- 1.6/1.7 配置ip
- 深入学习Apache Spark和TensorFlow
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法