#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
using namespace std;
inline int read() {
  int x = 0;
  bool t = false;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') t = true, ch = getchar();
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - 48, ch = getchar();
  return t ? -x : x;
}
int n, m, i, j;
double f[3005][3005], p[3005][3005], tmp[3005], dlt[3005], ans;
void resolve(int x) {
  int i;
  for ((i) = (0); (i) <= (n); (i)++) {
    tmp[i] = f[x][i];
  }
  f[x][0] = 0;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    f[x][i] = tmp[i - 1] * p[i][x] + f[x][i - 1] * (1 - p[i][x]);
  }
  dlt[x] -= f[x][n];
}
int main() {
  scanf("%d%d", &n, &m);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    for (((j)) = (1); ((j)) <= ((m)); ((j))++) {
      scanf("%lf", &p[i][j]);
      p[i][j] /= 1000.0;
    }
  }
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    f[i][0] = 1;
    for (((j)) = (1); ((j)) <= ((n)); ((j))++) {
      f[i][j] = f[i][j - 1] * (1.0 - p[j][i]);
    }
    dlt[i] = 1.0 - f[i][n];
  }
  for (int i = 1; i <= n; ++i) {
    int k = 0;
    for (int j = 1; j <= m; ++j)
      if (dlt[j] > dlt[k]) k = j;
    ans += dlt[k];
    resolve(k);
  }
  printf("%.10f\n", ans);
  return 0;
}

### Prompt

Generate a CPP solution to the following problem:

You are going to work in Codeforces as an intern in a team of n engineers, numbered 1 through n. You want to give each engineer a souvenir: a T-shirt from your country (T-shirts are highly desirable in Codeforces). Unfortunately you don't know the size of the T-shirt each engineer fits in. There are m different sizes, numbered 1 through m, and each engineer will fit in a T-shirt of exactly one size.

You don't know the engineers' exact sizes, so you asked your friend, Gerald. Unfortunately, he wasn't able to obtain the exact sizes either, but he managed to obtain for each engineer i and for all sizes j, the probability that the size of the T-shirt that fits engineer i is j.

Since you're planning to give each engineer one T-shirt, you are going to bring with you exactly n T-shirts. For those n T-shirts, you can bring any combination of sizes (you can bring multiple T-shirts with the same size too!). You don't know the sizes of T-shirts for each engineer when deciding what sizes to bring, so you have to pick this combination based only on the probabilities given by your friend, Gerald. 

Your task is to maximize the expected number of engineers that receive a T-shirt of his size. 

This is defined more formally as follows. When you finally arrive at the office, you will ask each engineer his T-shirt size. Then, if you still have a T-shirt of that size, you will give him one of them. Otherwise, you don't give him a T-shirt. You will ask the engineers in order starting from engineer 1, then engineer 2, and so on until engineer n.

Input

The first line contains two space-separated integers n and m (1 ≤ n ≤ 3000, 1 ≤ m ≤ 300), denoting the number of engineers and the number of T-shirt sizes, respectively.

Then n lines follow, each line contains m space-separated integers. The j-th integer in the i-th line represents the probability that the i-th engineer fits in a T-shirt of size j. Each probability will be given as an integer between 0 and 1000, inclusive. The actual probability should be calculated as the given number divided by 1000. 

It is guaranteed that for any engineer, the sum of the probabilities for all m T-shirts is equal to one.

Output

Print a single real number denoting the maximum possible expected number of engineers that will receive a T-shirt.

For the answer the absolute or relative error of 10 - 9 is acceptable.

Examples

Input

2 2
500 500
500 500


Output

1.500000000000


Input

3 3
1000 0 0
1000 0 0
0 1000 0


Output

3.000000000000


Input

1 4
100 200 300 400


Output

0.400000000000

Note

For the first example, bring one T-shirt of each size. With 0.5 chance, either both engineers fit inside T-shirts of size 1 or both fit inside T-shirts of size 2. With the other 0.5 chance, one engineer fits inside a T-shirt of size 1 and the other inside a T-shirt of size 2. If the first is true, the number of engineers that receive a T-shirt is one. If the second is true, the number of such engineers is two. Hence, the expected number of engineers who receive a T-shirt is 1.5. This is maximum possible expected number of engineers for all sets of T-shirts. 

For the second example, bring two T-shirts of size 1 and one T-shirt of size 2. This way, each engineer will definitely receive a T-shirt of his size.

For the third example, bring one T-shirt of size 4.

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
using namespace std;
inline int read() {
  int x = 0;
  bool t = false;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') t = true, ch = getchar();
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - 48, ch = getchar();
  return t ? -x : x;
}
int n, m, i, j;
double f[3005][3005], p[3005][3005], tmp[3005], dlt[3005], ans;
void resolve(int x) {
  int i;
  for ((i) = (0); (i) <= (n); (i)++) {
    tmp[i] = f[x][i];
  }
  f[x][0] = 0;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    f[x][i] = tmp[i - 1] * p[i][x] + f[x][i - 1] * (1 - p[i][x]);
  }
  dlt[x] -= f[x][n];
}
int main() {
  scanf("%d%d", &n, &m);
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    for (((j)) = (1); ((j)) <= ((m)); ((j))++) {
      scanf("%lf", &p[i][j]);
      p[i][j] /= 1000.0;
    }
  }
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    f[i][0] = 1;
    for (((j)) = (1); ((j)) <= ((n)); ((j))++) {
      f[i][j] = f[i][j - 1] * (1.0 - p[j][i]);
    }
    dlt[i] = 1.0 - f[i][n];
  }
  for (int i = 1; i <= n; ++i) {
    int k = 0;
    for (int j = 1; j <= m; ++j)
      if (dlt[j] > dlt[k]) k = j;
    ans += dlt[k];
    resolve(k);
  }
  printf("%.10f\n", ans);
  return 0;
}

```