Public model for matrix
以下是可以加减乘除(就是乘逆矩阵啦)以及求若干次幂、行列式和逆的矩阵模板。
欢迎大家指正其中可能存在的错误(只验证了求逆的正确性)。
顺便提一下这种复杂度低于定义式求逆的方法,来自于我的高等代数书,思想就是对分块矩阵(A E)进行行变换从而得到(E A^-1),复杂度与消元一样,都是 O(N^3)的。
const int N=405,ha=1e9+7;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;}
inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
}
inline int Get_inv(int x){ return ksm(x,ha-2);}
struct matrix{
int a[N][N],n;
inline void clear(){ memset(a,0,sizeof(a));}
inline void Base(){ clear(); for(int i=1;i<=n;i++) a[i][i]=1;}
inline void input(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) scanf("%d",a[i]+j);
}
inline void output(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) printf("%d ",a[i][j]);
puts("");
}
}
inline void swap(int x,int y){
for(int i=1;i<=n;i++) swap(a[x][i],a[y][i]);
}
inline void add(int from,int tmp,int to){
for(int i=1;i<=n;i++) ADD(a[to][i],a[from][i]*(ll)tmp%ha);
}
inline void mul(int x,int ml){
for(int i=1;i<=n;i++) a[x][i]=a[x][i]*(ll)ml%ha;
}
inline int Determinant(){
int an=1;
matrix b=*this;
for(int i=1,o,inv;i<=n;i++){
for(o=i;o<=n;o++) if(b.a[o][i]) break;
if(o>n) return 0;
if(o>i){ an=ha-an; b.swap(o,i);}
inv=Get_inv(b.a[i][i]);
for(int j=i+1,tmp;j<=n;j++) if(b.a[j][i])
tmp=ha-inv*(ll)b.a[j][i]%ha,b.add(i,tmp,j);
an=an*(ll)b.a[i][i]%ha;
}
return an;
}
inline matrix ni(){
matrix b; b.n=n,b.Base();
if(!Determinant()) b.clear();
else{
//先化成对角线元素都是1的上三角矩阵
for(int i=1,o,inv;i<=n;i++){
for(o=i;o<=n;o++) if(a[o][i]) break;
if(o>i) swap(o,i),b.swap(o,i);
inv=Get_inv(a[i][i]),mul(i,inv),b.mul(i,inv);
for(int j=i+1,tmp;j<=n;j++) if(a[j][i])
tmp=ha-a[j][i],add(i,tmp,j),b.add(i,tmp,j);
}
//然后再把A消成单位矩阵
for(int i=n-1;i;i--)
for(int j=i+1;j<=n;j++) if(a[i][j]) b.add(j,ha-a[i][j],i),add(j,ha-a[i][j],i);
}
return b;
}
matrix operator +(const matrix &u){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(a[i][j],u.a[i][j]);
return *this;
}
matrix operator -(const matrix &u){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(a[i][j],ha-u.a[i][j]);
return *this;
}
matrix operator *(const matrix &u)const{
matrix r; r.clear(),r.n=n;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(r.a[i][j],a[i][k]*(ll)u.a[k][j]%ha);
return r;
}
matrix operator /(matrix &u)const{
return *this*u.ni();
}
matrix operator ^(int &u){
matrix b,c=*this; b.n=n,b.Base();
for(;u;u>>=1,c=c*c) if(u&1) b=b*c;
return b;
}
}JHY;
Public model for matrix的更多相关文章
- Android笔记——Matrix
转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...
- [Web API] Web API 2 深入系列(6) Model绑定(上)
目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...
- Android中图像变换Matrix的原理、代码验证和应用(二)
第二部分 代码验证 在第一部分中讲到的各种图像变换的验证代码如下,一共列出了10种情况.如果要验证其中的某一种情况,只需将相应的代码反注释即可.试验中用到的图片: 其尺寸为162 x 251. 每种变 ...
- Android Matrix
转自 :http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#code Matrix的数学原理 平移变换 旋转变换 缩放变换 错切 ...
- UNITY_MATRIX_IT_MV[Matrix] (转载)
转载 http://blog.csdn.net/cubesky/article/details/38682975 前面发了一篇关于unity Matrix的文章. http://blog.csdn.n ...
- Android源码之Matrix
Matrix类在Android中主要用来进行矩阵变换,其可操作的对象包括图像.点阵.Vector(向量).矩形等. Matrix支持的变换类型主要有以下几种: 1.Translate:平移变换 2.R ...
- android.graphics.Matrix
Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTra ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- Android Matrix详解
Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.An ...
随机推荐
- Tree Generator™ CodeForces - 1149C (线段树,括号序列)
大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algor ...
- Apache2.4+Tomcat7.0+php5.5整合配置详解
在上一篇的基础上,继续添加php的配置 一.首先下载php5.5 首先下载php5.5,到官网下载http://www.php.net/downloads.php,参考http://www.cnblo ...
- css 水平垂直居中 & vertical-align
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 已知宽度的元素居中 position定位 + margin负值 绝对定位 + 4个方向全部`0px` + ...
- 定时任务FluentScheduler
1.Nuget 安装包 2.创建3个不同的任务 public class MyJob : IJob { void IJob.Execute() { Trace.WriteLine("现在时间 ...
- Eclipse syntax coloring java xml 语法 样式
自定义java源文件的编码样式,包括关键词等等的样式和颜色等,可以一边调下面就能看到样式效果,这是我自己一个个设置好的如图 自定义xml文件编辑器的样式格式,其实我装了sublime 但是 eclip ...
- Django 之一些request封装的常用功能
一些常用的request对象属性 介绍 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其 ...
- Jmeter5.1——聚合报告参数分析
Jmeter5.1——聚合报告参数分析 Label: 每个JMeter的element的Name值.例如HTTP Request的Name. Samples:发出请求的数量.如果线程组中配置的是线程数 ...
- SAP WebIDE里UI5应用的隐藏文件project.json
在SAP WebIDE UI5应用编辑器里的菜单View->Show Hidden files点击后,即可发现项目文件夹下有一个隐藏文件project.json: 内容如下: 这也解释了为什么b ...
- 1.Java集合-HashMap实现原理及源码分析
哈希表(Hash Table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常 ...
- editplus多行合并成一行
原文:https://www.cnblogs.com/jpfss/p/9238877.html Editplus 合并行快捷键: Ctrl+Shift+J ,选中要合并的行,再按快捷键即可