#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
const double EPS = 1e-6;
const int INF = 0x3fffffff;
const long long LINF = INF * 1ll * INF;
const double PI = acos(-1.0);
using namespace std;
char g[505][505];
int cnt[505];
int dp[2][505][505];
int C[505][505];
int mod;
void Add(int &ans, int v) {
  ans += v;
  if (ans >= mod) ans -= mod;
}
int main(void) {
  int n, m;
  scanf("%d %d %d", &n, &m, &mod);
  C[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    C[i][0] = 1;
    for (int j = 1; j <= i; j++)
      C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
  }
  for (int i = 0; i < (m); ++i) {
    scanf("%s", g[i]);
    for (int j = 0; j < (n); ++j) cnt[j] += g[i][j] - '0';
  }
  int cnt0 = 0, cnt1 = 0;
  for (int i = 0; i < (n); ++i) {
    if (cnt[i] > 2) {
      puts("0");
      return 0;
    }
    if (cnt[i] == 1)
      cnt1++;
    else if (cnt[i] == 0)
      cnt0++;
  }
  int now = 0;
  dp[now][cnt0][cnt1] = 1;
  for (int i = m; i < n; i++) {
    memset(dp[now ^ 1], 0, sizeof(dp[now ^ 1]));
    for (int j = 0; j <= n; j++) {
      for (int k = 0; k + j <= n; k++) {
        if (dp[now][j][k] == 0) continue;
        if (j >= 2)
          Add(dp[now ^ 1][j - 2][k + 2], 1ll * C[j][2] * dp[now][j][k] % mod);
        if (k >= 2)
          Add(dp[now ^ 1][j][k - 2], 1ll * C[k][2] * dp[now][j][k] % mod);
        if (j && k)
          Add(dp[now ^ 1][j - 1][k],
              1ll * C[k][1] * C[j][1] % mod * dp[now][j][k] % mod);
      }
    }
    now ^= 1;
  }
  printf("%d\n", dp[now][0][0]);
  return 0;
}
