#include <cstdio>
#include <cstring>
const int maxn = 1E3 + 10;
const int maxm = 50;
int n, T, m;
double p[maxn][maxm], dp[maxn][maxm][maxm];
int main(int argc, char const *argv[])
{
while (~scanf("%d%d%d", &m, &T, &n) && n + T + m)
{
memset(p, 0, sizeof(p));
memset(dp, 0, sizeof(dp));
for (int i = 0; i < T; i++)
for (int j = 1; j <= m; j++)
scanf("%lf", &p[i][j]);
for (int i = 0; i < T; i++)
{
dp[i][0][0] = 1;
for (int j = 1; j <= m; j++)
{
dp[i][j][0] += dp[i][j - 1][0] * (1 - p[i][j]);
for (int k = 1; k <= j; k++)
dp[i][j][k] = dp[i][j - 1][k - 1] * p[i][j] + dp[i][j - 1][k] * (1 - p[i][j]);
}
}
double Atleast1 = 1, NoOne = 1, tmp;
for (int i = 0; i < T; i++)
{
tmp = 0;
Atleast1 *= (1 - dp[i][m][0]);
for (int j = 1; j <= n - 1; j++) tmp += dp[i][m][j];
NoOne *= tmp;
}
printf("%.3lf\n", Atleast1 - NoOne);
}
return 0;
}
p[i][j]表示第i个队伍做对第j题的概率。dp[i][j][k]表示第i个队伍在前j题中做对了k道的概率。
dp[i][j][k] = dp[i][j-1][k-1]*(p[i][j])+dp[i][j-1][k]*(1-p[i][j]);
再求出每个队都至少做对 1 道题的概率:tt *= 1 - dp[i][m][0];
最后再减去每个队都只做对了 1 ~ n-1 题的概率;