#include <bits/stdc++.h>
using namespace std;
char toUpper(const char &c) { return isupper(c) ? c : c - 'a' + 'A'; }
char toLower(const char &c) { return islower(c) ? c : c + 'a' - 'A'; }
bool isvowel(char c) {
  c = toLower(c);
  return (c == 'a' or c == 'e' or c == 'i' or c == 'i' or c == 'o' or
          c == 'u' || c == 'y');
}
void toLowerCase(string &s) {
  for (long long i = 0; i < s.size(); i++) {
    if (!islower(s[i])) {
      s[i] = tolower(s[i]);
    }
  }
}
void toUpperCase(string &s) {
  for (long long i = 0; i < s.size(); i++) {
    s[i] = toupper(s[i]);
  }
}
bool ispal(string s) {
  long long lo, hi;
  lo = 0;
  hi = s.length() - 1;
  while (lo <= hi) {
    if (s[lo] != s[hi]) {
      return 0;
    }
    lo++;
    --hi;
  }
  return 1;
}
template <class T>
string toString(T n) {
  string v = "";
  while (n) {
    v.push_back(n % 10 + '0');
    n /= 10;
  }
  reverse(v.begin(), v.end());
  return v;
}
template <typename t>
t gcd(t a, t b) {
  a = abs(a), b = abs(b);
  return ((b == 0) ? a : gcd(b, a % b));
}
template <typename t>
t lcm(t a, t b) {
  return (a * (b / gcd(a, b)));
}
template <typename T>
T modpow(T base, T exp, T modulus) {
  base %= modulus;
  T result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}
template <typename T>
void cumulative(T *a, T *b, T n) {
  for (long long i = 0; i < n; i++) {
    i ? b[i] = b[i - 1] + a[i] : b[i] = a[i];
  }
}
const int inf = 1e9 + 7;
const double eps = 1e-6;
const double pi = 1.00 * acos(-1.00);
long long n, m;
const int N = 250010;
long long fact[N];
void solve() {
  cin >> n >> m;
  fact[0] = fact[1] = 1;
  for (int i = 2; i <= n; i++) {
    fact[i] = (fact[i - 1] * i) % m;
  }
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    long long k = ((n - i) * fact[n - i]) % m;
    k = (k * fact[i + 1]) % m;
    ans = (ans + k) % m;
  }
  cout << ans << endl;
}
int main() {
  solve();
  return 0;
}
