TOJ4537: n阶行列式
4537: n阶行列式 
Total Submit: 28 Accepted:3
Description
设有n²个数,排列成n行n列的表

其中p1,p2,p3,...,pn是1到n的一个全排列。标准次序是从小到大。
注意在这n个元素的任一排列中,当两个元素的先后次序与标准次序不同时,就说有一个逆序,一个排列中所有逆序的总和叫做这个排列的逆序数。逆序数为奇数的排列叫做奇排列,反之为偶排列。τ为当前排列的逆序数。
Input
每组数据一个n,接下来有n*n个数据。0<n<10。输入直到n为0结束。
Output
对于每组数据,输出n阶行列式D的值,每组数据后一换行。
Sample Input
2
3 -2
2 1
0
Sample Output
case1: D=7.
Source
我提供了两种写法,一种是其可以暴力算,但是复杂度还是挺高的
#include<iostream>
using namespace std;
__int64 det(__int64 *a, int n)
{
int i,j,m,c;
--n;
__int64 s=,b[n*n];
if(n==)return a[];
for(m=; m<=n+; m++)
{
c=;
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(!(i==||(j+)==m))
b[c++]=a[i*n+j+i];
if((m+)%)
s+=-*a[m-]*det(b,n);
else
s+=a[m-]*det(b,n);
}
return s;
}
int main()
{
__int64 a[];
int ca=,n,i,j;
while(cin>>n,n)
{
for(i=; i<n; i++)
for(j=; j<n; j++)
cin>>a[i*n+j];
cout<<"case"<<ca++<<": D="<<det(a,n)<<".\n\n";
}
return ;
}
化简成上三角行列式的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[][];
ll det(int n)
{
ll ans=;
int sign=;
for(int i=; i<n; i++) //当前行
{
for(int j=i+; j<n; j++) //当前之后的每一行,因为每一行的当前第一个数要转化成0(想想线性代数中行列式的计算)
{
int x=i,y=j;
while(a[y][i])//利用gcd的方法,不停地进行辗转相除
{
ll t=a[x][i]/a[y][i];
for(int k=i; k<n; k++)
a[x][k]=a[x][k]-a[y][k]*t;
swap(x,y);
}
if(x!=i)//奇数次交换,则D=-D'整行交换
{
for(int k=; k<n; k++)swap(a[i][k],a[x][k]);
sign^=;
}
}
if(a[i][i]==)//斜对角中有一个0,则结果为0
{
return ;
}
else
ans=ans*a[i][i];
}
if(sign)ans*=-;
return ans;
}
int main()
{
int ca=,n,i,j;
while(cin>>n,n)
{
for(i=; i<n; i++)
for(j=; j<n; j++)
cin>>a[i][j];
cout<<"case"<<ca++<<": D="<<det(n)<<".\n\n";
}
return ;
}
TOJ4537: n阶行列式的更多相关文章
- 行列式(三):n阶行列式
1.数学定义 n阶行列式定义如下: 2.算法实现 函数名: GetValue() 功能:返回一个行列式的值 Private Function GetValue() Dim gValue As Do ...
- n阶行列式计算----c语言实现(完结)
花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...
- 基于上三角变换或基于DFS的行(列)展开的n阶行列式求值算法分析及性能评估
进入大一新学期,看完<线性代数>前几节后,笔者有了用计算机实现行列式运算的想法.这样做的目的,一是巩固自己对相关概念的理解,二是通过独立设计算法练手,三是希望通过图表直观地展现涉及的两种算 ...
- 线代: N阶行列式
线性变换 将 (x, y) 变成 (2 x + y, x - 3 y) 就叫做线性变换, 这就是矩阵乘法, 用于表示一切线性变换. 几何上看, 把平面上的每个点 (x, y) 都变到 (2 x + y ...
- C#程序计算N阶行列式的值及N元一次方程组
C#程序计算N阶行列式的值及N元一次方程组 用了挺长时间自行完成了C#程序计算N阶行列式的值及N元一次方程组.由于自己没有在网上查阅其他资料,所以只能硬着头皮用最朴素的思想和基础的算法进行编程.在给出 ...
- n阶行列式算法(c程序)
#include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() { int n,a[N][ ...
- 计算n阶行列式的模板
之前在学习计数问题的时候也在网上找了很多关于行列式的资料 但是发现很多地方都只介绍2\3阶的情况 一些论文介绍的方法又看不懂 然后就一直耽搁着 今天恰好出到这样的题目 发现标算的代码简介明了 还挺开心 ...
- n阶行列式计算
1.化为上下三角 该类型的矩阵.行列式在之前写过(https://www.cnblogs.com/wangzheming35/p/12906624.html),也建议记住这个行列式的结论. 当然不仅仅 ...
- n阶行列式的全排列求解(Java)
上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...
随机推荐
- HDFS读写策略
数据的读取过程: 数据读取: 客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream. 通过RPC 远程调用NameNode ,获得NameNode 中此 ...
- pc端常见布局---水平居中布局 单元素不定宽度
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 一点对原生HTTP请求的理解与总结
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10946165.html,多谢,=.=~ 术语 HTTP:超文本传输协议,规定Web浏览器如何从W ...
- AHK进阶之路
本文摘自 http://www.cnblogs.com/echorep/p/4911117.html 小鸟学AHK(1)之运行程序或打开文档 AHK就是AutoHotKey,是一款免费的.Wind ...
- Windows服务管理
按键:win+R 输入:services.msc “服务和应用程序”界面选项打开 * sc命令的使用:create(创建) delete(删除)等 * service可执行文件路径的修改:win+R ...
- (原)IPhone开发时把ToolBar中的元素居中的技巧
在IPhone应用开发时,经常用到ToolBar,其中的控件通常都是居左,想让它居中就有点困难. 这里介绍一种方法: 将Flexible Space Bar Button Item从库中拖到位于控件左 ...
- Html5的等学习
看了w3c感觉是说明文档,没有详细的说明,然后就去看其他的 html5其实就是在html的基础上做了一些改变,感觉html5的推广还是需要时间的,因为习惯问题,虽然html5有很多很方便的标签如art ...
- iOS--获取文件目录的方法
很多文章都有写这个问题,我只是为了记录一下,免得总翻书... 1.Documents 目录: 你应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.L ...
- stringByAppendingString和stringByAppendingPathComponent
NSString提供了两个拼串的方法: /** * @brief 简单的字符串拼接,头文件 NSString (NSStringExtensionMethods) * * @param aString ...
- [LOJ] #2360. 「NOIP2016」换教室
期望DP #include<iostream> #include<cstring> #include<cstdio> #include<cctype> ...