java高斯消元模板
//package fuc; import java.io.PrintStream;
import java.math.BigInteger;
import java.util.Scanner; public class Main {
public static void main(String[] args) {
new Task().main();
}
}
class frac{
BigInteger a,b;
frac(){
a=BigInteger.ZERO;
b=BigInteger.ONE;
}
frac(BigInteger a,BigInteger b){
this.a=a;
this.b=b;
}
frac sub(frac t){
BigInteger p, q, d;
p = a.multiply(t.b);
p = p.subtract(t.a.multiply(b));
q = b.multiply(t.b);
d = p.gcd(q);
p = p.divide(d);
q = q.divide(d);
return new frac(p, q);
}
frac add(frac t){
BigInteger d, p, q;
p = a.multiply(t.b);
p = p.add(t.a.multiply(b));
q = b.multiply(t.b);
d = p.gcd(q);
p = p.divide(d);
q = q.divide(d);
return new frac(p, q);
}
frac div(frac t) {
BigInteger p, q, d;
p = a.multiply(t.b);
q = b.multiply(t.a);
d = p.gcd(q);
p = p.divide(d);
q = q.divide(d);
return new frac(p, q);
}
frac mul(frac t) {
BigInteger p, q, d;
p = a.multiply(t.a);
q = b.multiply(t.b);
d = p.gcd(q);
p = p.divide(d);
q = q.divide(d);
return new frac(p, q);
}
frac abs() {
return new frac(a.abs(), b.abs());
}
int compareTo(frac t) {
t = this.sub(t);
return t.a.compareTo(BigInteger.ZERO);
}
boolean zero() {
return a.equals(BigInteger.ZERO);
}
}
class Task{ Scanner cin = new Scanner(System.in);
PrintStream cout = System.out;
BigInteger ONE= BigInteger.ONE;
BigInteger ZERO=BigInteger.ZERO;
frac[][] a = new frac[211][211];
frac[] x = new frac[211];
frac t;
frac zero=new frac(ZERO,ONE);
frac r,one =new frac(ONE,ONE);
boolean gauss(int n){
int i,j,k,row;
for(i=1;i<=n;i++){
row=i;
for (j=i+1;j<=n;j++){
if (a[row][i].abs().compareTo(a[j][i].abs())<0){
row = j;
}
}
if (a[row][i].compareTo(zero)==0){
return false;
}
if (row!=i){
for (k=i;k<=n;k++){
t=a[row][k];
a[row][k]=a[i][k];
a[i][k]=t;
}
t=x[row];
x[row]=x[i];
x[i]=t;
}
for (j=i+1;j<=n;j++){
r=a[j][i].div(a[i][i]);
a[j][i]=zero;
for (k=i+1;k<=n;k++){
a[j][k]=a[j][k].sub(r.mul(a[i][k]));
}
x[j]=x[j].sub(r.mul(x[i]));
}
}
for (i=n;i>=1;i--){
for (j=i-1;j>=1;j--){
r=a[j][i].div(a[i][i]);
a[j][i]=zero;
x[j]=x[j].sub(r.mul(x[i]));
}
}
for (i=1;i<=n;i++){
x[i]=x[i].div(a[i][i]);
}
return true;
} void main(){
int n,i,j;
while(cin.hasNext()){
n = cin.nextInt();
for (i=1; i<= n; ++i){
for (j=1; j<=n; ++j){
a[i][j]=new frac(cin.nextBigInteger(),ONE);
}
x[i]=new frac(cin.nextBigInteger(),ONE);
}
if (!gauss(n)){
cout.println("No solution.");
}
else{
for (i=1;i<=n;i++){
if (x[i].b.compareTo(ZERO)<0){
x[i].a=x[i].a.negate();
x[i].b=x[i].b.negate();
}
}
for (i=1;i<=n;i++){
cout.print(x[i].a);
if (x[i].b.compareTo(ONE)!=0){
cout.print("/"+x[i].b);
}
cout.println();
}
}
cout.println();
}
} }
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2449
java高斯消元模板的更多相关文章
- 高斯消元模板!!!bzoj1013
/* 高斯消元模板题 n维球体确定圆心必须要用到n+1个点 设圆心坐标(x1,x2,x3,x4...xn),半径为C 设第i个点坐标为(ai1,ai2,ai3,,,ain)那么对应的方程为 (x1-a ...
- HDU 3359 高斯消元模板题,
http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...
- 【Luogu】P3389高斯消元模板(矩阵高斯消元)
题目链接 高斯消元其实是个大模拟qwq 所以就着代码食用 首先我们读入 ;i<=n;++i) ;j<=n+;++j) scanf("%lf",&s[i][j]) ...
- 【转】高斯消元模板 by kuangbin
写的很好,注释很详细,很全面. 原blog地址:http://www.cnblogs.com/kuangbin/archive/2012/09/01/2667044.html #include< ...
- kuangbin大佬的高斯消元模板
dalao解释的博客 #include <bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN ...
- 高斯消元模板(pascal)
洛谷P3389评测 program rrr(input,output); const eps=1e-8; var a:..,..]of double; n,i,j,k:longint; t:doubl ...
- hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】
含高斯消元模板 2016沈阳区域赛http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Limit: 2 ...
- NEFU 503 矩阵求解 (非01异或的高斯消元)
题目链接 中文题,高斯消元模板题. #include <iostream> #include <cstdio> #include <cmath> #include ...
- hdu4418(概率dp + 高斯消元)
应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...
随机推荐
- CSS三角的写法(兼容IE6)
目录 简介 优点 原理 1. 先创建一个div 2. 然后给div设定边框. 3. 给div的四个边框都设置不同的颜色 4. 把宽度和高度都变成0 5. 其余角为透明 6. 兼容IE6浏览器 造成这样 ...
- dirname命令和basename命令
dirname返回文件所在目录路径,而basename则相反,去掉路径返回最后的文件名. direname: 用途 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的 ...
- 【NOIP2017提高A组模拟10.7】Adore
题目 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i < n - 1) ...
- setAttribute()方法和 getAttribute() 方法
一.setAttribute() 方法 setAttribute() 方法为一个或一组元素添加指定的属性,并且为其赋指定的值.(主要针对自定义属性) 如果这个属性已经存在,仅仅设置或是修改属性值. 浏 ...
- C# 3.0
序言 自动实现的属性 匿名类型 查询表达式 Lambda 表达式 从 C# 3 开始,lambda 表达式提供了一种更简洁和富有表现力的方式来创建匿名函数. 使用 => 运算符构造 lambda ...
- 文件操作:fseek()
int fseek(FILE *stream, long offset, int fromwhere); fseek 用于二进制方式打开的文件,移动文件读写指针位置. int fseek( FIL ...
- 5.聚类算法k-means
聚类与分类的区别在于,是在没有给定划分类别的情况下,更具数据相似度进行样本分组的一种办法,是一种非监督的学习算法,聚类的输入时一组未被标记的样本,聚类更具数据自身的距离或者相似度将其划分为若干组,划分 ...
- Keil工程Lib库文件的制作和运用
最近看了百度手环开源项目,发现所有的算法都被封装成了一个lib文件在keil中调用 也是第一次学习到. 问题引出:为什么要做成lib库? 1.有些方案公司为了将自己写的关键部分源代码不进行公开,但是同 ...
- Linux环境下TomCat使用指定JDK的版本
服务器是web服务器,在上面安装了jdk1.7和jdk1.8.及多个tomcat应用,默认/etc/profile 配置的jdk1.7,大部分tomcat应用使用的也是jdk1.7, 但目前有一个新项 ...
- Linux-expect脚本-1
expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 首行加上/usr/bin/expect spawn: 后面加上需要执行的shell命令,比如说spawn sudo ...