void exgcd(int a,int b,int &d,int &x,int &y){
if(!b) { d=x; x=1,y=0; }
else { exgcd(b,a%b,d,y,x); y-=x*(a/b); }
}
int Abs(int x) { return x<0?-x:x; }
int Gauss_mod(int A[][100],int n,int m){//n个方程,m-1个变量,最后一列是系数列
int i,j;
for(i=0,j=0;i//化成上三角阵
int maxr=i;
for(int k=i+1;kif(Abs(A[k][j])>Abs(A[maxr][j])) maxr=k;//第i列最大行
if(Abs(A[maxr][j])==0) {j++,i--; continue; }
if(maxr!=i) for(int jj=j;jj//交换行
for(int k=i+1;k//消元
if(A[k][j]){
int tmpa=A[i][j],tmpb=A[k][j];
for(int l=j;l*tmpa-A[i][l]*tmpb)%p;
if(A[k][l]<0) A[k][l]+=p;
}
}
}
j++;
}
for(int k=i;kif(A[k][m-1]) return -1; }//之后的行的最后一列如果存在非0元素,则无解
int free_num=n-i;//自由变量个数
for(int k=0;k//交换列,使得对角元非0 ----不确定此步正确性
if(!A[k][k]){
int l=k;
for(int l=k+1;lif(A[k][l]) break;
if(l>k) for(int h=0;h0,sizeof(x));
for(int i=n-1;i>=0;i--){//代入求解
int tmp=A[i][n];
for(int j=i+1;j*A[i][j])%p+p)%p;
}
int d,xx,yy;
exgcd(A[i][i],p,d,xx,yy);
x[i]=(tmp*((xx%p+p)%p))%p;;
}
return 1<//返回解的个数
}