分析
代码
#include<bits/stdc++.h> using namespace std; #define lb double const lb eps = 1e-8; lb g[110][110],res=1.0; int n; inline lb gs(){ int i,j,k; lb ans=1.0; for(i=1;i<=n;i++){ int mx=i; for(j=1;j<=n;j++) if(g[mx][i]<g[j][i])mx=j; if(mx!=i)ans=-ans,swap(g[i],g[mx]); if(fabs(g[i][i])<eps)return 0.0; for(j=i+1;j<=n;j++){ lb t=g[j][i]/g[i][i]; for(k=i;k<=n;k++) g[j][k]-=t*g[i][k]; } ans*=g[i][i]; } return ans; } int main(){ int i,j,k; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%lf",&g[i][j]); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ if(fabs(g[i][j])<eps)g[i][j]=eps; if(fabs(1.0-g[i][j])<eps)g[i][j]=1.0-eps; if(j>i)res*=(1.0-g[i][j]); g[i][j]=g[i][j]/(1.0-g[i][j]); } for(i=1;i<=n;i++){ g[i][j]=0.0; for(j=1;j<=n;j++) if(i!=j)g[i][i]+=g[i][j],g[i][j]=-g[i][j]; } n--; printf("%0.6lf\n",res*gs()); return 0; }