#include <bits/stdc++.h>
const int MAXN = 1e6 + 10, MOD = 998244353;
struct Z {
  int x;
  Z(int x = 0) : x(x) {}
};
inline Z operator+(const Z &a, const Z &b) {
  return Z(a.x + b.x >= MOD ? a.x + b.x - MOD : a.x + b.x);
}
inline Z operator+(const Z &a, const int &b) {
  return Z(a.x + b >= MOD ? a.x + b - MOD : a.x + b);
}
inline Z operator+(const int &a, const Z &b) {
  return Z(a + b.x >= MOD ? a + b.x - MOD : a + b.x);
}
inline Z operator-(const Z &a, const Z &b) {
  return Z(a.x < b.x ? a.x - b.x + MOD : a.x - b.x);
}
inline Z operator-(const Z &a, const int &b) {
  return Z(a.x < b ? a.x - b + MOD : a.x - b);
}
inline Z operator-(const int &a, const Z &b) {
  return Z(a < b.x ? a - b.x + MOD : a - b.x);
}
inline Z operator*(const Z &a, const Z &b) {
  return Z(1LL * a.x * b.x - 1LL * a.x * b.x / MOD * MOD);
}
inline Z operator*(const Z &a, const int &b) {
  return Z(1LL * a.x * b - 1LL * a.x * b / MOD * MOD);
}
inline Z operator*(const int &a, const Z &b) {
  return Z(1LL * a * b.x - 1LL * a * b.x / MOD * MOD);
}
inline Z operator^(Z a, int k) {
  Z ans(1);
  for (; k; a = a * a, k >>= 1)
    if (k & 1) ans = ans * a;
  return ans;
}
inline Z operator~(Z a) { return a ^ (MOD - 2); }
inline Z operator/(const Z &a, const Z &b) { return a * (~b); }
inline Z operator/(const Z &a, const int &b) { return a * (~Z(b)); }
inline Z operator/(const int &a, const Z &b) { return a * (~b); }
inline Z operator+=(Z &a, const Z &b) { return a = a + b; }
inline Z operator+=(Z &a, const int &b) { return a = a + b; }
inline Z operator-=(Z &a, const Z &b) { return a = a - b; }
inline Z operator-=(Z &a, const int &b) { return a = a - b; }
inline Z operator*=(Z &a, const Z &b) { return a = a * b; }
inline Z operator*=(Z &a, const int &b) { return a = a * b; }
inline Z operator/=(Z &a, const Z &b) { return a = a / b; }
inline Z operator/=(Z &a, const int &b) { return a = a / b; }
int n;
Z N;
Z fac[MAXN], ifac[MAXN], f[MAXN];
inline Z df(Z n) { return n * n - n - n + 2; }
int main() {
  scanf("%d", &n), N = n;
  fac[0] = 1;
  for (int i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i;
  ifac[n] = ~fac[n];
  for (int i = n - 1; ~i; --i) ifac[i] = ifac[i + 1] * (i + 1);
  for (int i = 1; i <= n; ++i) f[i] = df(n - i + 1) * fac[n] * ifac[n - i + 1];
  Z S = n * fac[n], ans;
  for (int i = 1; i <= n; ++i) ans += f[i] * i;
  for (int i = 1; i < n; ++i) ans += (fac[n] - f[i]) * (i + n);
  ans = S * (S + 1) / 2 - ans + N * N;
  printf("%d\n", ans.x);
  return 0;
}
