#include #include #include #include using Matrix = std::vector>; // Intentionally incorrect: fixed-iteration fictitious play converges too // slowly to guarantee the accuracy required by the problem. double solve(const Matrix& a) { constexpr int iterations = 200000; const int n = static_cast(a.size()); const int m = static_cast(a[0].size()); std::vector row_sum(n, 0.0); std::vector column_sum(m, 0.0); int alice = 0; int bob = 0; for (int iteration = 0; iteration < iterations; ++iteration) { if (iteration != 0) { alice = static_cast( std::max_element(row_sum.begin(), row_sum.end()) - row_sum.begin()); bob = static_cast( std::min_element(column_sum.begin(), column_sum.end()) - column_sum.begin()); } for (int i = 0; i < n; ++i) row_sum[i] += a[i][bob]; for (int j = 0; j < m; ++j) column_sum[j] += a[alice][j]; } const double lower = *std::min_element(column_sum.begin(), column_sum.end()) / iterations; const double upper = *std::max_element(row_sum.begin(), row_sum.end()) / iterations; return (lower + upper) / 2; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int tests; std::cin >> tests; std::cout << std::fixed << std::setprecision(15); while (tests--) { int n, m; std::cin >> n >> m; Matrix a(n, std::vector(m)); for (auto& row : a) for (double& value : row) std::cin >> value; std::cout << solve(a) << '\n'; } }