#include <bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
double eps = 1e-7;
struct Mat{
double mat[maxn][maxn];
int row, col;
Mat(int _row, int _col){
memset(mat, 0, sizeof(mat));
for(int i=0; i<maxn; i++) mat[i][i] = 1;
row = _row, col = _col;
}
Mat(){
memset(mat, 0, sizeof(mat));
for(int i=0; i<maxn; i++){mat[i][i] = 1;}
}
};
struct Matrix{
Mat a;
Matrix mul(Mat b) {
Matrix temp;
memset(temp.a.mat, 0, sizeof(temp.a.mat));
for(int i=0; i<a.row; i++){
for(int j=0; j<b.col; j++){
for(int k=0; k<a.col; k++){
temp.a.mat[i][j] += a.mat[i][k]*b.mat[k][j];
}
}
}
temp.a.row = a.row, temp.a.col = b.col;
return temp;
}
Mat trans(){
Mat temp = a;
for(int i=0; i<a.row; i++){
for(int j=0; j<a.col; j++){
temp.mat[j][i] = a.mat[i][j];
}
}
swap(a.row, a.col);
memset(a.mat, 0, sizeof(a.mat));
for(int i=0; i<a.row; i++){
for(int j=0; j<a.col; j++){
a.mat[i][j] = temp.mat[i][j];
}
}
}
Matrix operator / (double di){
Matrix temp;
for(int i=0; i<a.row; i++){
for(int j=0; j<a.col; j++){
temp.a.mat[i][j] = a.mat[i][j]/di;
}
}
temp.a.row = a.row, temp.a.col = a.col;
return temp;
}
};
void prin(Matrix a){
for(int i=0; i<a.a.row; i++){
for(int j=0; j<a.a.col; j++){
printf("%lf ", a.a.mat[i][j]);
}
printf("\n");
}
}
double table[maxn][maxn] = {{35, 1, 13, 2, 4, 41, 34, 15, 47, 1},
{21, 19, 38, 39, 9, 24, 22, 32, 35, 37},
{13, 33, 32, 8, 5, 24, 47, 17, 29, 11}};
int row, col;
double A[maxn][maxn];
double C[maxn][maxn];
void up_train(int row, int col){
memset(C, 0, sizeof(C));
cout<<endl<<endl<<endl<<endl;
cout<<row<<" "<<col<<endl;
for(int i=0; i<max(row, col); i++) C[i][i] = 1;
for(int i=0; i<row; i++){
if(fabs(A[i][i])<eps&&i==0){
int k=i+1;
while(fabs(A[k][i])<eps&&k<row){
k++;
}
bool has = false;
if(fabs(A[k][i])>eps&&k<row) has = true;
if(has){
for(int t=0; t<col; t++) {
A[i][t] += A[k][t];
}
for(int t=0; t<row; t++){
A[t][i] += A[t][k];
}
for(int t=0; t<row; t++){
C[t][i] += C[t][k];
}
}
else{
for(int t=0; t<col; t++) {
A[i][t] += A[i-1][t];
}
for(int t=0; t<col; t++) {
A[t][i] += A[t][i-1];
}
for(int t=0; t<col; t++) {
C[t][i] += C[t][i-1];
}
}
}
for(int j=0; j<i; j++){
double tim = A[i][j]/A[j][j];
A[i][j] = 0.0;
for(int k=j+1; k<col; k++){
A[i][k] -= tim*A[j][k];
}
for(int k=0; k<row; k++){
A[k][i] -= tim*A[k][j];
}
for(int k=0; k<row; k++){
C[k][i] -= tim*C[k][j];
}
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
}
printf("-----------\n");
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
printf("%lf ", C[i][j]);
}
printf("\n");
}
for(int i=row-1; i>=0; i--){
for(int j=col-1; j>i; j--){
if(A[j][j] == 0) continue;
double tim = A[i][j]/A[j][j];
A[i][j] = 0.0;
for(int k=j-1; k>i; k--){
A[i][k] -= tim*A[j][k];
}
for(int k=0; k<col; k++){
A[k][i] -= tim*A[k][j];
}
for(int k=0; k<col; k++){
C[k][i] -= tim*C[k][j];
}
}
}
printf("second time:---------\n");
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
printf("%lf ", C[i][j]);
}
printf("\n");
}
printf("seperate line\n");
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
printf("%lf ", A[i][j]);
}
printf("\n");
}
}
double te[maxn][maxn] = {{0, 1.0/2, -5.0/2}, {1.0/2, 0, 1.0/2}, {-5.0/2, 1.0/2, 0}};
void test(){
row = col = 3;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
A[i][j] = te[i][j];
}
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
cout<<A[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
Matrix a1;
a1.a.row = 3, a1.a.col = 10;
for(int i=0; i<a1.a.row; i++){
for(int j=0; j<a1.a.col; j++){
a1.a.mat[i][j] = table[i][j];
}
}
for(int i=0; i<a1.a.row; i++){
double ave = 0;
for(int j=0; j<a1.a.col; j++){
ave += a1.a.mat[i][j];
}
cout<<ave<<" ";
ave /= a1.a.col;
cout<<ave<<endl;
for(int j=0; j<a1.a.col; j++){
a1.a.mat[i][j] -= ave;
}
}
Matrix a_t = a1;
a_t.trans();
prin(a_t);
Matrix ans = (a1.mul(a_t.a));
ans = ans/(a1.a.col-1);
printf("\n\n\n");
prin(ans);
row = ans.a.row;
col = ans.a.col;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
A[i][j] = ans.a.mat[i][j];
}
}
up_train(row, col);
return 0;
}