有小数版
#include<stdio.h>
const int N=110;
double mat[N][N*2];
double a[N][N],b[N][N],c[N][N];
int n;void mul(int k,double x){for(int i=1;i<=n*2;i++){mat[k][i]*=x;}
}void add(int k,int u,double x){for(int i=1;i<=n*2;i++){mat[k][i]+=mat[u][i]*x;}
}double calc(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int u=1;u<=n;u++){c[i][j]+=a[i][u]*b[u][j];}}}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){mat[i][n+i]=1; for(int j=1;j<=n;j++){scanf("%lf",&a[i][j]);mat[i][j]=a[i][j];}} // for(int i=1;i<=n;i++){
// for(int j=1;j<=n*2;j++){
// printf("%lf ",mat[i][j]);
// }
// putchar('\n');
// } for(int i=1;i<=n;i++){mul(i,1/mat[i][i]);for(int j=i+1;j<=n;j++){add(j,i,-mat[j][i]);}}for(int i=n;i>1;i--){for(int j=i-1;j>=1;j--){add(j,i,-mat[j][i]);}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){b[i][j]=mat[i][j+n];}}for(int i=1;i<=n;i++){for(int j=1;j<=n*2;j++){printf("%lf ",mat[i][j]);}putchar('\n');} calc();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%lf ",c[i][j]);}putchar('\n');} return 0;
}
无小数版
#include<stdio.h>
const int N=110,MOD=1e9+7;
typedef long long LL;
LL mat[N][N*2];
LL a[N][N],b[N][N],c[N][N];
int n;LL qmi(LL x,LL y){LL res=1;while(y){if(y&1) res=res*x%MOD;x=x*x%MOD;y>>=1;}return res;
}void mul(int k,LL x){for(int i=1;i<=n*2;i++){mat[k][i]=(mat[k][i]*x%MOD+MOD)%MOD;}
}void add(int k,int u,LL x){for(int i=1;i<=n*2;i++){mat[k][i]=((mat[k][i]+mat[u][i]*x)%MOD+MOD)%MOD;}
}void calc(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int u=1;u<=n;u++){c[i][j]=((c[i][j]+a[i][u]*b[u][j])%MOD+MOD)%MOD;}}}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){mat[i][n+i]=1; for(int j=1;j<=n;j++){scanf("%lld",&a[i][j]);mat[i][j]=a[i][j];}} for(int i=1;i<=n;i++){for(int j=1;j<=n*2;j++){printf("%lld ",mat[i][j]);}putchar('\n');} for(int i=1;i<=n;i++){mul(i,qmi(mat[i][i],MOD-2));for(int j=i+1;j<=n;j++){add(j,i,-mat[j][i]);}}for(int i=1;i<=n;i++){for(int j=1;j<=n*2;j++){printf("%lld ",mat[i][j]);}putchar('\n');} for(int i=n;i>1;i--){for(int j=i-1;j>=1;j--){add(j,i,-mat[j][i]);}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){b[i][j]=mat[i][j+n];}}for(int i=1;i<=n;i++){for(int j=1;j<=n*2;j++){printf("%lld ",mat[i][j]);}putchar('\n');} calc();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%lld ",c[i][j]);}putchar('\n');} return 0;
}