#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chkmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <class T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
inline long long Max(long long x, long long y) { return x > y ? x : y; }
inline long long Min(long long x, long long y) { return x < y ? x : y; }
int n, m, mod;
char s[502][502];
int col[502];
long long dp[502][502];
void Add(long long &x, long long y) {
  x += y;
  if (x >= mod)
    x %= mod;
  else if (x < 0)
    x += mod;
}
int main() {
  scanf("%d%d%d", &n, &m, &mod);
  for (int i = (1), i_end_ = (m); i <= i_end_; i++) {
    scanf("%s", s[i] + 1);
    for (int j = (1), j_end_ = (n); j <= j_end_; j++)
      if (s[i][j] == '1') col[j]++;
  }
  int cnt0 = 0, cnt1 = 0;
  for (int i = (1), i_end_ = (n); i <= i_end_; i++)
    cnt0 += (col[i] == 0), cnt1 += (col[i] == 1);
  dp[cnt0][cnt1] = 1;
  for (int i = (cnt0), i_end_ = (0); i >= i_end_; i--)
    for (int j = (n), j_end_ = (0); j >= j_end_; j--) {
      if (!dp[i][j]) continue;
      if (i >= 2) Add(dp[i - 2][j + 2], dp[i][j] * i * (i - 1) / 2 % mod);
      if (j >= 2) Add(dp[i][j - 2], dp[i][j] * j * (j - 1) / 2 % mod);
      if (i >= 1 && j >= 1) Add(dp[i - 1][j], dp[i][j] * i * j % mod);
    }
  printf("%I64d\n", dp[0][0]);
  return 0;
}
