#include <stdio.h> #include <string.h> #include <iostream> #define INF 1000000000 #define MAXN 3000 int data[MAXN/50+5][MAXN+5],ans,n,m,g[MAXN/50+5][MAXN]; int vx[MAXN],vy[MAXN],st[MAXN],lx[MAXN],ly[MAXN],mat[MAXN]; int DFS(int x){ vx[x]=1; for(int i=1 ; i<=m ; i++ ){ if( !vy[i] && lx[x]+ly[i]==g[x][i]) { vy[i]=1; if( mat[i] ==-1 || DFS(mat[i])){ mat[i] = x; return 1; } } else if(lx[x] +ly[i] > g[x][i] && st[i]>lx[x] +ly[i]-g[x][i]) st[i]=lx[x] +ly[i]-g[x][i]; } return 0; } int KM(){ int i,j,k; for( i=1 ; i<=n ; i++ ){ lx[ i ] = -INF; for ( j=1 ; j<=m ; j++ ) if( lx[i]<g[i][j] )lx[i]=g[i][j]; } memset(ly,0,sizeof(ly)); memset(mat,-1,sizeof(mat)); for( k=1 ; k<=n ; k++ ){ while(1){ memset(vx,0,sizeof(vx)); memset(vy,0,sizeof(vy)); for( i=1 ; i<=m ; st[i++]=INF); if( DFS(k) )break; int ai=INF; for(i=1;i<=m;i++) if(st[i]<ai)ai=st[i]; for( i=1 ; i<=m ; i++ ){ if( vx[i] ) lx[i]-=ai; if( vy[i] ) ly[i]+=ai; } } } for( i= 1,j=0 ; i<=m ; i++) if(mat[i]!=-1) j+=g[mat[i]][i]; return j; } int main() { int i,j,k; int casee; scanf("%d",&casee); while(casee--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&data[i][j]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=1;k<=n;k++) { g[i][(j-1)*n+k]=-data[i][j]*k; } m=m*n; int ans=KM(); double op; op=ans*1.0/n*1.0; printf("%.6lf/n",-op); } system("pause"); return 0; }