#include<bits/stdc++.h>
using namespace std;
int m,n,flag[52],bj[52],s,r;
long long matrix_up[52][52],matrix_dn[52][52];
long long ans_up[52],ans_dn[52],up,dn;
void input()
{
cout<<"请输入m行n列增广矩阵中的m、n:"<<endl;
cin>>m>>n;
cout<<"请输入增广矩阵:"<<endl;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>matrix_up[i][j];
matrix_dn[i][j]=1;
}
//输入分子,分母初始化为1
ans_dn[i]=1;
}
}
long long gcd(long long a,long long b)
{
long long r;
while(b>0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
bool yue_fen(long long a,long long b)
{
long long div=a/b;
if(b*div==a)
return 0;
up=a/gcd(abs(a),abs(b));
dn=b/gcd(abs(a),abs(b));
return 1;
}
void cut(int one,int two,int list)
{
for(int i=list+1;i<=n;i++)
{
matrix_dn[one][i]*=matrix_up[one][list];
matrix_up[one][i]*=matrix_dn[one][list];
matrix_dn[two][i]*=matrix_up[two][list];
matrix_up[two][i]*=matrix_dn[two][list];
}
matrix_dn[one][list]=1;
matrix_up[one][list]=1;
matrix_dn[two][list]=1;
matrix_up[two][list]=1;
for(int i=list;i<=n;i++)
{
matrix_up[two][i]=matrix_dn[one][i]*matrix_up[two][i]-matrix_dn[two][i]*matrix_up[one][i];
matrix_dn[two][i]*=matrix_dn[one][i];
if(matrix_up[two][i])
{
yue_fen(matrix_up[two][i],matrix_dn[two][i]);
matrix_up[two][i]=up;
matrix_dn[two][i]=dn;
}
}
}
void work()
{
for(int list=1;list<=n-1;list++)
{
short one=0,two=0;
for(int i=1;i<=m;i++)
{
if(one && matrix_up[i][list]!=0 && !bj[i])
{
two=i;
cut(one,two,list);
}
if(matrix_up[i][list]!=0 && !bj[i])
{
one=i;
cut(one,0,list);
flag[list]=i;//搞个指针
bj[i]=1;//这一行是否处理过
}
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(matrix_up[i][j])
{
r++;
if(j!=n)
s++;
break;
}
}
}
ans_up[n]=-1;ans_dn[n]=1;//bi赋值便于运算
for(int list=n-1;list>=1;list--)
{
for(int i=list+1;i<=n;i++)
{
ans_up[list]=ans_up[list]*matrix_dn[flag[list]][i]*ans_dn[i]-matrix_up[flag[list]][i]*ans_up[i]*ans_dn[list];
ans_dn[list]*=ans_dn[i]*matrix_dn[flag[list]][i];
}
}
}
void output()
{
if(s<r)
{
cout<<"神说此题没有解捏";
return ;
}
else
if(r<n-1)
{
cout<<"无穷多的解";
return;
}
for(int i=1;i<=m;i++)
{
if(yue_fen(ans_up[i],ans_dn[i])==1)
cout<<"X"<<i<<"="<<up<<"/"<<dn<<endl;
else
cout<<"X"<<i<<"="<<ans_up[i]/ans_dn[i]<<endl;
}
}
int main()
{
input();
work();
output();
return 0;
}