有小數版
#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;
}